home *** CD-ROM | disk | FTP | other *** search
/ Graphics Plus / Graphics Plus.iso / general / viewers / prev / prev.lha / gram.c < prev    next >
C/C++ Source or Header  |  1991-03-12  |  66KB  |  2,261 lines

  1. extern char *malloc(), *realloc();
  2.  
  3. # line 6 "gram.y"
  4. #include <stdio.h>
  5. #include <math.h>
  6. #include "art.h"
  7. #include "macro.h"
  8.  
  9. extern object    *objectinit(),
  10.         *compinit(),
  11.         *csginit(),
  12.         *getcsgobj(),
  13.         *getcsgexp();
  14.  
  15. extern symbol    *lookup();
  16.  
  17. extern light    *lightinit();
  18.  
  19. extern attr    *astackp;
  20. extern mats    *mstackp;
  21.  
  22. extern object    *oblist;
  23. extern light    *lights;
  24.  
  25. extern vector    eye, viewup, ref;
  26. extern int    lookatdone;
  27.  
  28. extern matrix    trans;
  29. extern float    fov;
  30. extern float    near;
  31.  
  32. extern char    *title;
  33. extern int    maxhitlevel, raysperpix, pixelgrid;
  34. extern long    filetype;
  35.  
  36. extern colour    backcol;
  37.  
  38. extern float    fogfactor, rfactor;
  39. extern colour    hazecolour;
  40.  
  41. extern float    sourceradius;
  42. extern float    falloff;
  43. extern float    ri;
  44.  
  45. extern float    twist;
  46. extern float    screenx, screeny;
  47. extern int    orthographic;
  48.  
  49. extern float        eval_fexpr();
  50. extern int        eval_iexpr();
  51. extern expression    *get_expr(), *get_varexpr();
  52.  
  53. #ifndef M_PI
  54. #define M_PI    3.14159265358979323846
  55. #endif
  56.  
  57. static int    objdefined = FALSE;
  58.  
  59. extern symbol    **ostackp;
  60.  
  61.  
  62. # line 65 "gram.y"
  63. typedef union {
  64.     object        *y_obj;
  65.     light        *y_lht;
  66.     vector        *y_pnt;
  67.     details        *y_det;
  68.     char        *y_str;
  69.     eqn        *y_eqn;
  70.     term        *y_trm;
  71.     expression    *y_exp;
  72.     symbol        *y_sym;
  73.     csgnode        *y_csg;
  74.     float        y_flt;
  75.     int        y_int;
  76. } YYSTYPE;
  77. # define CSG 257
  78. # define COMPOSITE 258
  79. # define OBJECT_TYPE 259
  80. # define FLOAT 260
  81. # define INTEGER 261
  82. # define FILETYPE 262
  83. # define OPTION 263
  84. # define NAME 264
  85. # define LBRACE 265
  86. # define RBRACE 266
  87. # define LP 267
  88. # define RP 268
  89. # define RADIUS 269
  90. # define RADII 270
  91. # define COLOUR 271
  92. # define CENTER 272
  93. # define VERTEX 273
  94. # define COMMA 274
  95. # define PCENT 275
  96. # define MATERIAL 276
  97. # define REFI 277
  98. # define MINUS 278
  99. # define AMBIENT 279
  100. # define LIGHT 280
  101. # define INTENSITY 281
  102. # define LOCATION 282
  103. # define DOLS 283
  104. # define EQUATION 284
  105. # define TILE 285
  106. # define OFFFILE 286
  107. # define BASE 287
  108. # define TOP 288
  109. # define CONST 289
  110. # define COEFFS 290
  111. # define ART_SCALE 291
  112. # define ART_ROTATE 292
  113. # define ART_TRANSLATE 293
  114. # define PROJECTION 294
  115. # define ORTHOGRAPHIC 295
  116. # define PERSPECTIVE 296
  117. # define TITLE 297
  118. # define REFLECTANCE 298
  119. # define DOT 299
  120. # define ON 300
  121. # define OFF 301
  122. # define LOOKAT 302
  123. # define FIELDOFVIEW 303
  124. # define TRANSPARENCY 304
  125. # define RAYSPERPIXEL 305
  126. # define BACKGROUND 306
  127. # define SIZE 307
  128. # define MAXHITLEVEL 308
  129. # define OUTPUT 309
  130. # define ORDER 310
  131. # define ABSORPTION 311
  132. # define VREF1 312
  133. # define VREF2 313
  134. # define NUMRAYS 314
  135. # define OBJECT 315
  136. # define TEXTURE 316
  137. # define DIRECTION 317
  138. # define ANGLE 318
  139. # define UP 319
  140. # define TWENTYFIVEBIT 320
  141. # define RANGE 321
  142. # define MAP 322
  143. # define BLENDCOLOR 323
  144. # define SCALEFACTORS 324
  145. # define VORTFILE 325
  146. # define HAZECOLOUR 326
  147. # define FOGFACTOR 327
  148. # define RFACTOR 328
  149. # define FALLOFF 329
  150. # define QUOTE 330
  151. # define REPEAT 331
  152. # define SHADOWS 332
  153. # define COLOURFILE 333
  154. # define VNORMALFILE 334
  155. # define SCALEFACTOR 335
  156. # define SOURCE 336
  157. # define AMPLITUDE 337
  158. # define WAVELENGTH 338
  159. # define PHASE 339
  160. # define TURBULENCE 340
  161. # define SQUEEZE 341
  162. # define DAMPING 342
  163. # define SOURCERADIUS 343
  164. # define NORMAL 344
  165. # define COMPLEXVERTEX 345
  166. # define SCREENSIZE 346
  167. # define MAXTREEDEPTH 347
  168. # define BLEND 348
  169. # define COLOURMAP 349
  170. # define MAPVALUES 350
  171. # define PIXELGRID 351
  172. # define RI 352
  173. # define COLOURBLEND 353
  174. # define NORMALFILE 354
  175. # define BEAMDISTRIBUTION 355
  176. # define INSIDEANGLE 356
  177. # define PLUS 357
  178. # define MULT 358
  179. # define DIV 359
  180. # define POWER 360
  181. # define UMINUS 361
  182. # define EQUALS 362
  183. #define yyclearin yychar = -1
  184. #define yyerrok yyerrflag = 0
  185. extern int yychar;
  186. extern int yyerrflag;
  187. #ifndef YYMAXDEPTH
  188. #define YYMAXDEPTH 150
  189. #endif
  190. YYSTYPE yylval, yyval;
  191. # define YYERRCODE 256
  192. int yyexca[] ={
  193. -1, 1,
  194.     0, -1,
  195.     -2, 0,
  196.     };
  197. # define YYNPROD 154
  198. # define YYLAST 1142
  199. int yyact[]={
  200.  
  201.    107,   415,    95,   332,   411,   129,   218,   232,   129,    62,
  202.     68,    69,    70,    71,    72,    73,    74,   130,   131,   318,
  203.    160,   161,    82,    83,   159,    85,    86,   158,   301,   417,
  204.    187,   182,    63,    64,   414,    96,    66,   264,   230,   129,
  205.    101,   102,   103,    87,   129,   109,   110,   111,   112,    77,
  206.     67,   123,   124,   117,   118,   119,   120,   121,   122,   410,
  207.    153,   193,   125,   129,   196,   108,   202,   374,   133,   409,
  208.     78,    79,    76,    75,   262,   256,   100,   195,   361,   129,
  209.     99,   136,   137,   126,   128,   130,   131,   128,   130,   131,
  210.    319,    98,    97,    81,   400,   408,   146,    80,   148,   149,
  211.    150,   151,    65,   338,   368,   129,   205,   154,    32,   197,
  212.    403,   339,   201,   200,   129,   367,   388,   229,   128,   130,
  213.    131,   292,   227,   128,   130,   131,   129,   203,    93,   183,
  214.    184,   185,   186,   402,    91,   188,   189,   129,    89,   192,
  215.     94,    93,   128,   130,   131,    92,    91,   249,   397,   362,
  216.    199,   198,   129,   223,    92,   307,   226,   239,   128,   130,
  217.    131,   145,   129,   233,   234,   235,   236,    90,    89,   317,
  218.    318,   240,   241,   242,   243,   244,   245,   143,   247,   248,
  219.     37,    35,    36,   251,   128,   130,   131,   141,    88,    94,
  220.     90,   253,   254,   128,   130,   131,   173,   257,   258,   259,
  221.    260,   261,   246,   263,   238,   128,   130,   131,   132,   297,
  222.    171,   168,   172,   174,   176,   396,   128,   130,   131,   129,
  223.    281,   282,   283,   284,   175,   179,   286,   316,   288,   177,
  224.    178,   128,   130,   131,    37,    35,    36,   170,   169,   319,
  225.    302,   128,   130,   131,   216,   387,   127,   116,   391,   209,
  226.    173,   115,   129,   309,   383,   129,   312,   313,   129,   217,
  227.    114,   113,    61,   314,   171,   168,   172,   174,   176,   380,
  228.    386,    84,   389,   129,   333,   385,   140,   105,   175,   179,
  229.    129,   323,   321,   177,   178,   129,   328,   273,   330,   142,
  230.    272,   170,   169,   144,   334,   335,   336,   337,   128,   130,
  231.    131,   298,   147,   373,   341,   342,   343,   129,   237,   351,
  232.    379,   352,   353,   194,   139,   129,   356,     5,   317,   318,
  233.    129,     3,   209,   269,     2,   278,   363,   364,   365,     1,
  234.    366,   128,   130,   131,   128,   130,   131,   128,   130,   131,
  235.    302,   371,   300,   270,   299,     6,   345,   306,   375,   376,
  236.    377,   378,   128,   130,   131,   381,   382,   299,   104,   128,
  237.    130,   131,   157,     0,   128,   130,   131,     0,   370,   384,
  238.    390,     0,     0,   392,   393,   394,     0,     0,   160,   161,
  239.      0,   395,   159,   269,   398,   158,   128,   130,   131,   372,
  240.      0,     0,   401,   129,   128,   130,   131,   404,   405,   128,
  241.    130,   131,   369,   406,   407,     0,   129,    30,    29,    28,
  242.      0,   412,   413,    58,    31,   211,   416,     4,   207,    40,
  243.     41,    52,    38,    42,     0,     0,    53,   167,   180,    54,
  244.     27,   224,     0,   215,    43,    60,    48,    47,    46,    45,
  245.     44,    37,    35,    36,    16,   355,     0,     7,    55,   129,
  246.      0,     0,    20,     8,    56,    11,    21,     0,    22,    23,
  247.     39,    57,   276,     0,   354,     0,    59,     0,   129,    19,
  248.     18,   340,   128,   130,   131,   129,    12,    13,    14,    24,
  249.      0,    34,    26,    49,    50,   128,   130,   131,   329,   129,
  250.    250,   278,   129,    15,   331,   129,     9,    10,   360,     0,
  251.      0,    17,    25,     0,    51,   274,   275,   271,   319,     0,
  252.      0,    58,   273,     0,   228,   272,     0,    40,    41,    52,
  253.     38,    42,     0,   206,    53,    33,     0,    54,   128,   130,
  254.    131,     0,    43,    60,    48,    47,    46,    45,    44,    37,
  255.     35,    36,     0,   324,     0,     0,    55,   128,   130,   131,
  256.      0,     0,    56,   129,   128,   130,   131,   327,    39,    57,
  257.      0,   129,   326,     0,    59,     0,   129,     0,   128,   130,
  258.    131,   128,   130,   131,   128,   130,   131,   214,   213,   212,
  259.      0,    49,    50,    58,     0,     0,   266,   317,   318,    40,
  260.     41,    52,    38,    42,     0,     0,    53,     0,     0,    54,
  261.      0,     0,    51,     0,    43,    60,    48,    47,    46,    45,
  262.     44,    37,    35,    36,     0,   325,     0,     0,    55,   129,
  263.      0,   160,   161,   156,    56,   159,     0,     0,   158,   291,
  264.     39,    57,   128,   130,   131,     0,    59,     0,     0,   230,
  265.    128,   130,   131,     0,     0,   128,   130,   131,     0,   214,
  266.    213,   212,     0,    49,    50,    58,     0,     0,   208,     0,
  267.      0,    40,    41,    52,    38,    42,   210,     0,    53,     0,
  268.      0,    54,     0,   231,    51,     0,    43,    60,    48,    47,
  269.     46,    45,    44,    37,    35,    36,   267,     0,     0,     0,
  270.     55,     0,     0,     0,     0,     0,    56,     0,   128,   130,
  271.    131,     0,    39,    57,     0,     0,    58,     0,    59,   265,
  272.      0,     0,    40,    41,    52,    38,    42,     0,   229,    53,
  273.      0,     0,    54,     0,     0,    49,    50,    43,    60,    48,
  274.     47,    46,    45,    44,    37,    35,    36,     0,   315,   210,
  275.    268,    55,   129,     0,   289,   290,    51,    56,   311,     0,
  276.      0,   310,   129,    39,    57,   129,     0,    58,   308,    59,
  277.    204,     0,   129,    40,    41,    52,    38,    42,     0,     0,
  278.     53,   305,     0,    54,     0,   129,    49,    50,    43,    60,
  279.     48,    47,    46,    45,    44,    37,    35,    36,     0,   304,
  280.      0,     0,    55,   129,     0,   303,     0,    51,    56,   129,
  281.    268,     0,   296,     0,    39,    57,   129,   295,     0,     0,
  282.     59,   129,   294,     0,     0,   293,   129,     0,     0,   129,
  283.    287,   128,   130,   131,   129,   285,     0,    49,    50,   129,
  284.      0,   128,   130,   131,   128,   130,   131,     0,     0,     0,
  285.    255,   128,   130,   131,   129,   252,     0,     0,    51,   129,
  286.      0,     0,     0,   225,   128,   130,   131,   129,   222,     0,
  287.      0,   221,   129,     0,   220,   129,     0,   219,   129,     0,
  288.      0,   129,   128,   130,   131,     0,     0,   191,   128,   130,
  289.    131,   129,     0,     0,   190,   128,   130,   131,   129,   165,
  290.    128,   130,   131,   129,     0,   128,   130,   131,   128,   130,
  291.    131,     0,   164,   128,   130,   131,   129,   163,   128,   130,
  292.    131,   129,   162,     0,     0,   155,   129,     0,   152,   129,
  293.      0,     0,   129,   128,   130,   131,     0,   138,   128,   130,
  294.    131,   129,     0,     0,     0,   135,   128,   130,   131,   129,
  295.      0,   128,   130,   131,   128,   130,   131,   128,   130,   131,
  296.    128,   130,   131,   134,     0,     0,     0,   129,     0,   320,
  297.    128,   130,   131,   322,     0,     0,     0,   128,   130,   131,
  298.      0,   181,   128,   130,   131,     0,     0,     0,     0,     0,
  299.      0,     0,     0,     0,     0,   128,   130,   131,     0,     0,
  300.    128,   130,   131,   166,     0,   128,   130,   131,   128,   130,
  301.    131,   128,   130,   131,   357,   358,   359,     0,   344,     0,
  302.    128,   130,   131,   173,   346,     0,     0,     0,   128,   130,
  303.    131,     0,     0,     0,     0,   279,     0,   171,   168,   172,
  304.    174,   176,   399,   279,     0,   173,   128,   130,   131,     0,
  305.    277,   175,   179,     0,     0,     0,   177,   178,     0,   171,
  306.    168,   172,   174,   176,   170,   169,     0,    37,    35,    36,
  307.      0,     0,     0,   175,   179,    37,    35,    36,   177,   178,
  308.      0,    63,    64,     0,     0,    66,   170,   169,   106,   348,
  309.    347,   349,     0,     0,   350,     0,     0,     0,     0,    67,
  310.      0,     0,     0,     0,     0,     0,     0,   280,     0,     0,
  311.      0,     0,     0,     0,     0,   280,     0,     0,     0,     0,
  312.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  313.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  314.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  315.      0,    65 };
  316. int yypact[]={
  317.  
  318.  -1000,   150, -1000, -1000, -1000, -1000, -1000,    -2,  -228,  -228,
  319.   -228,  -228,  -228,  -228,  -228,  -228,  -223,  -251,  -230,  -170,
  320.   -174,  -228,  -228,     9,  -228,  -228,  -258,   -77,   -97,  -119,
  321.   -124,  -360, -1000, -1000,  -228,  -175,  -176,  -187,  -191,  -228,
  322.   -228,  -228,   811,  -218,  -228,  -228,  -228,  -228,    -3,    -4,
  323.    -13,   -17,  -228,  -228,  -228,  -228,  -228,  -228,  -249,  -202,
  324.    -18, -1000,   217, -1000, -1000,   -56, -1000,  -228,   679,   217,
  325.    217,   661,   217,   217,   217, -1000, -1000, -1000, -1000, -1000,
  326.   -228,  -228,   653,   217, -1000,   217,   217, -1000, -1000, -1000,
  327.    -78, -1000,   -88, -1000,  -104,  -228,    37,  -228,  -228,  -228,
  328.   -228,   217,   217,   644,  -214, -1000,  -228,   641,   118,   638,
  329.    217,   217,   217, -1000, -1000, -1000, -1000,   633,   628,   615,
  330.    217,   217,   217, -1000, -1000,   728,   706,  -276,  -228,  -228,
  331.   -228,  -228,  -300, -1000,  -228,  -228,   610,   603,  -228,  -205,
  332.    494, -1000,   392, -1000, -1000, -1000,   217, -1000,   593,   590,
  333.    587,   584,  -228,   811,   579,  -228,  -240, -1000,   118,  -353,
  334.  -1000, -1000,  -228,  -228,  -228,  -228, -1000, -1000,   -60,  -108,
  335.   -228,  -228,  -228,  -228,  -228,  -228,   -62,  -228,  -228,  -118,
  336.  -1000, -1000,  -228,  -341,  -341, -1000, -1000, -1000,   217,   571,
  337.   -228,  -228,   566, -1000, -1000,  -192,  -228,  -228,  -228,  -228,
  338.   -228,  -193,  -228,  -264, -1000, -1000, -1000,   443, -1000, -1000,
  339.  -1000, -1000,  -127,  -131,  -137,   320,   248, -1000,   774,  -228,
  340.   -228,  -228,  -228,   551, -1000,  -228,   546,  -228,   118,   118,
  341.    118,   361,  -144,   541,   538,   533,   528,   -57, -1000,  -228,
  342.    217,   217,   521,   515,   497,   217, -1000,   217,   217, -1000,
  343.   -111,   484,  -228,   477,   474,  -228,  -228,   217,   217,   217,
  344.    217,   217,  -228,   464, -1000, -1000, -1000,   -39, -1000, -1000,
  345.  -1000,   -74,    23, -1000,   -75,  -110,   248, -1000, -1000, -1000,
  346.   -228,   275,   341,   288,   283,  -228,   214,  -228,   211,   118,
  347.    118,  -357,    13,  -228,  -228,  -228,  -228, -1000, -1000, -1000,
  348.   -163, -1000,   197,  -228,  -228,  -228,   742, -1000,  -228,   217,
  349.   -228,  -228,   217,   190,   171,  -228, -1000,    23,    23,    23,
  350.    230, -1000,  -188,  -116, -1000,  -228,  -228,  -228,   217,  -228,
  351.    217, -1000,  -150,  -162,   217,   217,   128,   217, -1000,  -228,
  352.   -228,   115,   217,    29, -1000, -1000,  -200,  -228,  -228,  -228,
  353.   -228,   217,    42,    -5,  -228,  -228,   -20,  -339, -1000,  -339,
  354.  -1000, -1000, -1000,     7,     2,   -23,  -152,    11, -1000,  -228,
  355.  -1000,   -26,  -228,  -228,  -228,   217,   217,   217,   217, -1000,
  356.   -228,   -59,  -126,  -228,   766, -1000, -1000, -1000, -1000,  -172,
  357.    217,  -228,   217,   217,  -141,  -164,  -228,  -228,   217, -1000,
  358.  -1000,   217,  -228,  -228,  -173,  -199,  -215,  -270, -1000, -1000,
  359.   -228,  -228,  -234,  -273, -1000,  -228,  -239, -1000 };
  360. int yypgo[]={
  361.  
  362.      0,     0,   514,   362,   686,   244,   415,   343,   358,   277,
  363.    276,   523,   106,     6,   289,   347,   346,   342,    28,   329,
  364.    324,   321,   317,   314,   313,   293,   308,   301,   259 };
  365. int yyr1[]={
  366.  
  367.      0,    19,    19,    19,    19,    19,    19,    20,    20,    20,
  368.     20,    20,    20,    20,    20,    20,    20,    20,    20,    20,
  369.     20,    20,    20,    20,    20,    20,    20,    20,    20,    21,
  370.     23,    23,    24,    24,    24,    24,    24,    24,    24,    24,
  371.     24,     6,     6,     6,    25,     6,    14,    14,    14,    14,
  372.     22,    22,    22,    22,    13,    13,    13,    13,    10,    10,
  373.     10,    11,    11,    11,    11,    11,    11,    11,    11,    11,
  374.     11,    11,    11,    11,    11,    11,    11,    11,    11,    11,
  375.     11,    11,    11,    11,    11,    11,    11,    11,    11,     8,
  376.      8,     9,     9,    12,    12,    12,    26,    26,    26,    27,
  377.     27,    27,    27,    27,    27,    27,    27,    27,    27,    27,
  378.     27,    17,    17,    18,    15,    15,    16,    16,    16,    16,
  379.     16,     5,     5,     5,     5,     7,    28,     7,     7,     4,
  380.      4,     4,     4,     4,     4,     2,     2,     2,     2,     2,
  381.      2,     3,     3,     3,     3,     1,     1,     1,     1,     1,
  382.      1,     1,     1,     1 };
  383. int yyr2[]={
  384.  
  385.      0,     1,     4,     4,     5,     4,     5,     4,     5,     9,
  386.      4,     4,    12,     4,     4,     4,     5,     5,     4,     4,
  387.      4,    17,    33,    12,     4,     4,     4,     4,     4,     8,
  388.      0,     4,    16,     4,     4,     4,     4,     4,    16,    12,
  389.      4,     9,     3,     9,     1,    13,     1,     5,     5,     5,
  390.      7,     3,     3,    11,     1,     5,     5,    13,     1,     5,
  391.      5,    17,     5,     5,     9,    13,     5,    13,    13,     5,
  392.      5,     5,     5,     5,     5,     5,    13,    17,    13,     5,
  393.      5,     5,     5,     5,    11,     7,     7,    11,    13,     3,
  394.      7,    15,    11,    13,    17,    17,     0,     4,     4,     4,
  395.      8,     4,     4,    12,     8,    12,     4,     4,     4,     4,
  396.      8,     3,     7,    11,     1,     5,    17,     5,     5,     5,
  397.      5,     1,     5,     5,     5,    11,     1,    15,    11,     3,
  398.      7,     7,     7,     7,     3,     3,     5,     7,    15,     7,
  399.      7,     3,     3,     3,    11,     3,     3,     7,     3,     7,
  400.      7,     7,     7,     5 };
  401. int yychk[]={
  402.  
  403.  -1000,   -19,   -20,   -21,    -6,   -22,    -7,   297,   303,   346,
  404.    347,   305,   326,   327,   328,   343,   294,   351,   320,   319,
  405.    302,   306,   308,   309,   329,   352,   332,   280,   259,   258,
  406.    257,   264,   -12,   -11,   331,   292,   293,   291,   272,   310,
  407.    269,   270,   273,   284,   290,   289,   288,   287,   286,   333,
  408.    334,   354,   271,   276,   279,   298,   304,   311,   263,   316,
  409.    285,   264,    -1,   260,   261,   330,   264,   278,    -1,    -1,
  410.     -1,    -1,    -1,    -1,    -1,   296,   295,   300,   300,   301,
  411.    267,   267,    -1,    -1,   262,    -1,    -1,   301,   265,   265,
  412.    264,   265,   264,   265,   264,   362,    -1,   267,   267,   267,
  413.    267,    -1,    -1,    -1,    -8,    -9,   267,    -1,   283,    -1,
  414.     -1,    -1,    -1,   264,   264,   264,   264,    -1,    -1,    -1,
  415.     -1,    -1,    -1,   300,   301,   264,   285,   264,   357,   278,
  416.    358,   359,   264,    -1,   274,   274,    -1,    -1,   274,   -23,
  417.    -10,   265,   -14,   265,   -25,   265,    -1,   265,    -1,    -1,
  418.     -1,    -1,   274,   274,    -1,   274,    -2,    -3,   267,   264,
  419.    260,   261,   274,   274,   274,   274,   265,   -27,   322,   349,
  420.    348,   321,   323,   307,   324,   335,   325,   340,   341,   336,
  421.    -27,   265,   307,    -1,    -1,    -1,    -1,   330,    -1,    -1,
  422.    274,   274,    -1,   266,   -24,   282,   269,   314,   356,   355,
  423.    318,   317,   271,   332,   266,   -12,   -11,   -10,   266,   -12,
  424.    -11,    -6,   259,   258,   257,   -14,    -5,   -28,   -13,   274,
  425.    274,   274,   274,    -1,    -9,   274,    -1,   362,    -2,   357,
  426.    278,    -2,   360,    -1,    -1,    -1,    -1,   -26,   264,   265,
  427.     -1,    -1,    -1,    -1,    -1,    -1,   264,    -1,    -1,   265,
  428.    -26,    -1,   274,    -1,    -1,   274,   267,    -1,    -1,    -1,
  429.     -1,    -1,   267,    -1,   301,   266,   266,    -4,   -11,   -12,
  430.     -7,   259,   267,   264,   257,   258,    -5,   266,   -12,   259,
  431.    331,    -1,    -1,    -1,    -1,   274,    -1,   274,    -1,    -2,
  432.     -2,   268,   265,   274,   274,   274,   274,   266,   -27,   -12,
  433.    -17,   -18,    -1,   274,   274,   274,   -15,   266,   274,    -1,
  434.    274,   274,    -1,    -1,    -1,   274,   266,   357,   358,   278,
  435.     -4,   259,    -4,    -1,   268,   274,   274,   274,    -1,   274,
  436.     -1,   283,   360,   261,    -1,    -1,    -1,    -1,   266,   274,
  437.    274,    -1,    -1,    -1,   266,   -16,   272,   338,   337,   339,
  438.    342,    -1,    -1,    -1,   274,   274,    -1,    -4,    -4,    -4,
  439.    268,   266,   265,    -1,    -1,    -1,    -1,   265,   266,   274,
  440.    -18,    -1,   274,   274,   267,    -1,    -1,    -1,    -1,   268,
  441.    274,    -1,    -1,   274,   -13,   268,   268,   268,   268,   261,
  442.     -1,   274,    -1,    -1,    -1,    -1,   274,   274,    -1,   266,
  443.    266,    -1,   274,   274,    -1,    -1,    -1,    -1,   268,   268,
  444.    274,   274,    -1,    -1,   268,   274,    -1,   268 };
  445. int yydef[]={
  446.  
  447.      1,    -2,     2,     3,     4,     5,     6,     0,     0,     0,
  448.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  449.      0,     0,     0,     0,     0,     0,     0,     0,    42,     0,
  450.      0,     0,    51,    52,     0,     0,     0,     0,     0,     0,
  451.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  452.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  453.      0,     7,     8,   145,   146,     0,   148,     0,     0,    10,
  454.     11,     0,    13,    14,    15,    16,    17,    18,    19,    20,
  455.      0,     0,     0,    24,    25,    26,    27,    28,    30,    58,
  456.      0,    46,     0,    44,     0,     0,     0,     0,     0,     0,
  457.      0,    62,    63,     0,    66,    89,     0,     0,     0,     0,
  458.     69,    70,    71,    72,    73,    74,    75,     0,     0,     0,
  459.     79,    80,    81,    82,    83,     0,     0,     0,     0,     0,
  460.      0,     0,     0,   153,     0,     0,     0,     0,     0,     0,
  461.      0,    58,     0,    46,   121,   126,    50,    54,     0,     0,
  462.      0,     0,     0,     0,     0,     0,     0,   135,     0,   141,
  463.    142,   143,     0,     0,     0,     0,    96,    85,     0,     0,
  464.      0,     0,     0,     0,     0,     0,     0,     0,     0,     0,
  465.     86,    96,     0,   149,   150,   151,   152,   147,     9,     0,
  466.      0,     0,     0,    29,    31,     0,     0,     0,     0,     0,
  467.      0,     0,     0,     0,    41,    59,    60,     0,    43,    47,
  468.     48,    49,    42,     0,     0,     0,     0,   121,     0,     0,
  469.      0,     0,     0,    64,    90,     0,     0,     0,   136,     0,
  470.      0,     0,     0,     0,     0,     0,     0,     0,    99,     0,
  471.    101,   102,     0,     0,     0,   106,   107,   108,   109,   114,
  472.      0,     0,     0,     0,     0,     0,     0,    33,    34,    35,
  473.     36,    37,     0,     0,    40,   125,   128,     0,   122,   123,
  474.    124,   129,     0,   134,     0,     0,     0,    53,    55,    56,
  475.      0,     0,     0,     0,     0,     0,     0,     0,     0,   139,
  476.    140,   137,     0,     0,     0,     0,     0,    84,    97,    98,
  477.      0,   111,     0,     0,     0,     0,     0,    87,     0,    12,
  478.      0,     0,    23,     0,     0,     0,    45,     0,     0,     0,
  479.      0,   129,     0,     0,    93,     0,     0,     0,    65,     0,
  480.     92,    67,     0,     0,    68,    76,     0,    78,   100,     0,
  481.      0,     0,   104,     0,   110,   115,     0,     0,     0,     0,
  482.      0,    88,     0,     0,     0,     0,     0,   130,   131,   132,
  483.    133,   127,    54,     0,     0,     0,     0,     0,   144,     0,
  484.    112,     0,     0,     0,     0,   117,   118,   119,   120,    21,
  485.      0,     0,     0,     0,     0,    94,    95,    61,    91,     0,
  486.     77,     0,   103,   105,     0,     0,     0,     0,    39,    57,
  487.    138,   113,     0,     0,     0,     0,     0,     0,    32,    38,
  488.      0,     0,     0,     0,   116,     0,     0,    22 };
  489. typedef struct { char *t_name; int t_val; } yytoktype;
  490. #ifndef YYDEBUG
  491. #    define YYDEBUG    0    /* don't allow debugging */
  492. #endif
  493.  
  494. #if YYDEBUG
  495.  
  496. yytoktype yytoks[] =
  497. {
  498.     "CSG",    257,
  499.     "COMPOSITE",    258,
  500.     "OBJECT_TYPE",    259,
  501.     "FLOAT",    260,
  502.     "INTEGER",    261,
  503.     "FILETYPE",    262,
  504.     "OPTION",    263,
  505.     "NAME",    264,
  506.     "LBRACE",    265,
  507.     "RBRACE",    266,
  508.     "LP",    267,
  509.     "RP",    268,
  510.     "RADIUS",    269,
  511.     "RADII",    270,
  512.     "COLOUR",    271,
  513.     "CENTER",    272,
  514.     "VERTEX",    273,
  515.     "COMMA",    274,
  516.     "PCENT",    275,
  517.     "MATERIAL",    276,
  518.     "REFI",    277,
  519.     "MINUS",    278,
  520.     "AMBIENT",    279,
  521.     "LIGHT",    280,
  522.     "INTENSITY",    281,
  523.     "LOCATION",    282,
  524.     "DOLS",    283,
  525.     "EQUATION",    284,
  526.     "TILE",    285,
  527.     "OFFFILE",    286,
  528.     "BASE",    287,
  529.     "TOP",    288,
  530.     "CONST",    289,
  531.     "COEFFS",    290,
  532.     "ART_SCALE",    291,
  533.     "ART_ROTATE",    292,
  534.     "ART_TRANSLATE",    293,
  535.     "PROJECTION",    294,
  536.     "ORTHOGRAPHIC",    295,
  537.     "PERSPECTIVE",    296,
  538.     "TITLE",    297,
  539.     "REFLECTANCE",    298,
  540.     "DOT",    299,
  541.     "ON",    300,
  542.     "OFF",    301,
  543.     "LOOKAT",    302,
  544.     "FIELDOFVIEW",    303,
  545.     "TRANSPARENCY",    304,
  546.     "RAYSPERPIXEL",    305,
  547.     "BACKGROUND",    306,
  548.     "SIZE",    307,
  549.     "MAXHITLEVEL",    308,
  550.     "OUTPUT",    309,
  551.     "ORDER",    310,
  552.     "ABSORPTION",    311,
  553.     "VREF1",    312,
  554.     "VREF2",    313,
  555.     "NUMRAYS",    314,
  556.     "OBJECT",    315,
  557.     "TEXTURE",    316,
  558.     "DIRECTION",    317,
  559.     "ANGLE",    318,
  560.     "UP",    319,
  561.     "TWENTYFIVEBIT",    320,
  562.     "RANGE",    321,
  563.     "MAP",    322,
  564.     "BLENDCOLOR",    323,
  565.     "SCALEFACTORS",    324,
  566.     "VORTFILE",    325,
  567.     "HAZECOLOUR",    326,
  568.     "FOGFACTOR",    327,
  569.     "RFACTOR",    328,
  570.     "FALLOFF",    329,
  571.     "QUOTE",    330,
  572.     "REPEAT",    331,
  573.     "SHADOWS",    332,
  574.     "COLOURFILE",    333,
  575.     "VNORMALFILE",    334,
  576.     "SCALEFACTOR",    335,
  577.     "SOURCE",    336,
  578.     "AMPLITUDE",    337,
  579.     "WAVELENGTH",    338,
  580.     "PHASE",    339,
  581.     "TURBULENCE",    340,
  582.     "SQUEEZE",    341,
  583.     "DAMPING",    342,
  584.     "SOURCERADIUS",    343,
  585.     "NORMAL",    344,
  586.     "COMPLEXVERTEX",    345,
  587.     "SCREENSIZE",    346,
  588.     "MAXTREEDEPTH",    347,
  589.     "BLEND",    348,
  590.     "COLOURMAP",    349,
  591.     "MAPVALUES",    350,
  592.     "PIXELGRID",    351,
  593.     "RI",    352,
  594.     "COLOURBLEND",    353,
  595.     "NORMALFILE",    354,
  596.     "BEAMDISTRIBUTION",    355,
  597.     "INSIDEANGLE",    356,
  598.     "PLUS",    357,
  599.     "MULT",    358,
  600.     "DIV",    359,
  601.     "POWER",    360,
  602.     "UMINUS",    361,
  603.     "EQUALS",    362,
  604.     "-unknown-",    -1    /* ends search */
  605. };
  606.  
  607. char * yyreds[] =
  608. {
  609.     "-no such reduction-",
  610.     "input : /* empty */",
  611.     "input : input hitem",
  612.     "input : input light",
  613.     "input : input object",
  614.     "input : input statement",
  615.     "input : input definition",
  616.     "hitem : TITLE NAME",
  617.     "hitem : FIELDOFVIEW expr",
  618.     "hitem : SCREENSIZE expr COMMA expr",
  619.     "hitem : MAXTREEDEPTH expr",
  620.     "hitem : RAYSPERPIXEL expr",
  621.     "hitem : HAZECOLOUR expr COMMA expr COMMA expr",
  622.     "hitem : FOGFACTOR expr",
  623.     "hitem : RFACTOR expr",
  624.     "hitem : SOURCERADIUS expr",
  625.     "hitem : PROJECTION PERSPECTIVE",
  626.     "hitem : PROJECTION ORTHOGRAPHIC",
  627.     "hitem : PIXELGRID ON",
  628.     "hitem : TWENTYFIVEBIT ON",
  629.     "hitem : TWENTYFIVEBIT OFF",
  630.     "hitem : UP LP expr COMMA expr COMMA expr RP",
  631.     "hitem : LOOKAT LP expr COMMA expr COMMA expr COMMA expr COMMA expr COMMA expr COMMA expr RP",
  632.     "hitem : BACKGROUND expr COMMA expr COMMA expr",
  633.     "hitem : MAXHITLEVEL expr",
  634.     "hitem : OUTPUT FILETYPE",
  635.     "hitem : FALLOFF expr",
  636.     "hitem : RI expr",
  637.     "hitem : SHADOWS OFF",
  638.     "light : LIGHT LBRACE lbody RBRACE",
  639.     "lbody : /* empty */",
  640.     "lbody : lbody litem",
  641.     "litem : LOCATION LP expr COMMA expr COMMA expr RP",
  642.     "litem : RADIUS expr",
  643.     "litem : NUMRAYS expr",
  644.     "litem : INSIDEANGLE expr",
  645.     "litem : BEAMDISTRIBUTION expr",
  646.     "litem : ANGLE expr",
  647.     "litem : DIRECTION LP expr COMMA expr COMMA expr RP",
  648.     "litem : COLOUR expr COMMA expr COMMA expr",
  649.     "litem : SHADOWS OFF",
  650.     "object : OBJECT_TYPE LBRACE body RBRACE",
  651.     "object : OBJECT_TYPE",
  652.     "object : COMPOSITE LBRACE compbody RBRACE",
  653.     "object : CSG LBRACE",
  654.     "object : CSG LBRACE csgbody csgexpr RBRACE",
  655.     "compbody : /* empty */",
  656.     "compbody : compbody transform",
  657.     "compbody : compbody bodyitem",
  658.     "compbody : compbody object",
  659.     "statement : NAME EQUALS expr",
  660.     "statement : transform",
  661.     "statement : bodyitem",
  662.     "statement : REPEAT expr LBRACE stlist RBRACE",
  663.     "stlist : /* empty */",
  664.     "stlist : stlist transform",
  665.     "stlist : stlist OBJECT_TYPE",
  666.     "stlist : stlist REPEAT expr LBRACE stlist RBRACE",
  667.     "body : /* empty */",
  668.     "body : body transform",
  669.     "body : body bodyitem",
  670.     "bodyitem : CENTER LP expr COMMA expr COMMA expr RP",
  671.     "bodyitem : ORDER expr",
  672.     "bodyitem : RADIUS expr",
  673.     "bodyitem : RADII expr COMMA expr",
  674.     "bodyitem : RADII expr COMMA expr COMMA expr",
  675.     "bodyitem : VERTEX vbody",
  676.     "bodyitem : EQUATION DOLS termlist EQUALS expr DOLS",
  677.     "bodyitem : COEFFS expr COMMA expr COMMA expr",
  678.     "bodyitem : CONST expr",
  679.     "bodyitem : TOP expr",
  680.     "bodyitem : BASE expr",
  681.     "bodyitem : OFFFILE NAME",
  682.     "bodyitem : COLOURFILE NAME",
  683.     "bodyitem : VNORMALFILE NAME",
  684.     "bodyitem : NORMALFILE NAME",
  685.     "bodyitem : COLOUR expr COMMA expr COMMA expr",
  686.     "bodyitem : MATERIAL expr COMMA expr COMMA expr COMMA expr",
  687.     "bodyitem : AMBIENT expr COMMA expr COMMA expr",
  688.     "bodyitem : REFLECTANCE expr",
  689.     "bodyitem : TRANSPARENCY expr",
  690.     "bodyitem : ABSORPTION expr",
  691.     "bodyitem : OPTION ON",
  692.     "bodyitem : OPTION OFF",
  693.     "bodyitem : TEXTURE NAME LBRACE texture_ops RBRACE",
  694.     "bodyitem : TEXTURE NAME textitem",
  695.     "bodyitem : TEXTURE TILE textitem",
  696.     "bodyitem : TEXTURE TILE LBRACE texture_ops RBRACE",
  697.     "bodyitem : TILE NAME SIZE expr COMMA expr",
  698.     "vbody : vitem",
  699.     "vbody : vbody COMMA vitem",
  700.     "vitem : LP expr COMMA expr COMMA expr RP",
  701.     "vitem : expr COMMA expr COMMA expr",
  702.     "transform : ART_ROTATE LP expr COMMA expr RP",
  703.     "transform : ART_TRANSLATE LP expr COMMA expr COMMA expr RP",
  704.     "transform : ART_SCALE LP expr COMMA expr COMMA expr RP",
  705.     "texture_ops : /* empty */",
  706.     "texture_ops : texture_ops textitem",
  707.     "texture_ops : texture_ops transform",
  708.     "textitem : MAP NAME",
  709.     "textitem : COLOURMAP LBRACE mbody RBRACE",
  710.     "textitem : BLEND expr",
  711.     "textitem : RANGE expr",
  712.     "textitem : BLENDCOLOR expr COMMA expr COMMA expr",
  713.     "textitem : SIZE expr COMMA expr",
  714.     "textitem : SCALEFACTORS expr COMMA expr COMMA expr",
  715.     "textitem : SCALEFACTOR expr",
  716.     "textitem : VORTFILE NAME",
  717.     "textitem : TURBULENCE expr",
  718.     "textitem : SQUEEZE expr",
  719.     "textitem : SOURCE LBRACE wbody RBRACE",
  720.     "mbody : mitem",
  721.     "mbody : mbody COMMA mitem",
  722.     "mitem : expr COMMA expr COMMA expr",
  723.     "wbody : /* empty */",
  724.     "wbody : wbody witem",
  725.     "witem : CENTER LP expr COMMA expr COMMA expr RP",
  726.     "witem : WAVELENGTH expr",
  727.     "witem : AMPLITUDE expr",
  728.     "witem : PHASE expr",
  729.     "witem : DAMPING expr",
  730.     "csgbody : /* empty */",
  731.     "csgbody : csgbody bodyitem",
  732.     "csgbody : csgbody transform",
  733.     "csgbody : csgbody definition",
  734.     "definition : OBJECT_TYPE NAME LBRACE body RBRACE",
  735.     "definition : CSG NAME LBRACE",
  736.     "definition : CSG NAME LBRACE csgbody csgexpr RBRACE",
  737.     "definition : COMPOSITE NAME LBRACE compbody RBRACE",
  738.     "csgexpr : OBJECT_TYPE",
  739.     "csgexpr : csgexpr PLUS csgexpr",
  740.     "csgexpr : csgexpr MULT csgexpr",
  741.     "csgexpr : csgexpr MINUS csgexpr",
  742.     "csgexpr : LP csgexpr RP",
  743.     "csgexpr : NAME",
  744.     "termlist : term",
  745.     "termlist : termlist termlist",
  746.     "termlist : LP termlist RP",
  747.     "termlist : LP termlist RP POWER LBRACE INTEGER RBRACE",
  748.     "termlist : termlist PLUS termlist",
  749.     "termlist : termlist MINUS termlist",
  750.     "term : NAME",
  751.     "term : FLOAT",
  752.     "term : INTEGER",
  753.     "term : NAME POWER LBRACE INTEGER RBRACE",
  754.     "expr : FLOAT",
  755.     "expr : INTEGER",
  756.     "expr : QUOTE NAME QUOTE",
  757.     "expr : NAME",
  758.     "expr : expr PLUS expr",
  759.     "expr : expr MINUS expr",
  760.     "expr : expr MULT expr",
  761.     "expr : expr DIV expr",
  762.     "expr : MINUS expr",
  763. };
  764. #endif /* YYDEBUG */
  765. #line 1 "/usr/lib/yaccpar"
  766. /*    @(#)yaccpar 1.10 89/04/04 SMI; from S5R3 1.10    */
  767.  
  768. /*
  769. ** Skeleton parser driver for yacc output
  770. */
  771.  
  772. /*
  773. ** yacc user known macros and defines
  774. */
  775. #define YYERROR        goto yyerrlab
  776. #define YYACCEPT    { free(yys); free(yyv); return(0); }
  777. #define YYABORT        { free(yys); free(yyv); return(1); }
  778. #define YYBACKUP( newtoken, newvalue )\
  779. {\
  780.     if ( yychar >= 0 || ( yyr2[ yytmp ] >> 1 ) != 1 )\
  781.     {\
  782.         yyerror( "syntax error - cannot backup" );\
  783.         goto yyerrlab;\
  784.     }\
  785.     yychar = newtoken;\
  786.     yystate = *yyps;\
  787.     yylval = newvalue;\
  788.     goto yynewstate;\
  789. }
  790. #define YYRECOVERING()    (!!yyerrflag)
  791. #ifndef YYDEBUG
  792. #    define YYDEBUG    1    /* make debugging available */
  793. #endif
  794.  
  795. /*
  796. ** user known globals
  797. */
  798. int yydebug;            /* set to 1 to get debugging */
  799.  
  800. /*
  801. ** driver internal defines
  802. */
  803. #define YYFLAG        (-1000)
  804.  
  805. /*
  806. ** static variables used by the parser
  807. */
  808. static YYSTYPE *yyv;            /* value stack */
  809. static int *yys;            /* state stack */
  810.  
  811. static YYSTYPE *yypv;            /* top of value stack */
  812. static int *yyps;            /* top of state stack */
  813.  
  814. static int yystate;            /* current state */
  815. static int yytmp;            /* extra var (lasts between blocks) */
  816.  
  817. int yynerrs;            /* number of errors */
  818.  
  819. int yyerrflag;            /* error recovery flag */
  820. int yychar;            /* current input token number */
  821.  
  822.  
  823. /*
  824. ** yyparse - return 0 if worked, 1 if syntax error not recovered from
  825. */
  826. int
  827. yyparse()
  828. {
  829.     register YYSTYPE *yypvt;    /* top of value stack for $vars */
  830.     unsigned yymaxdepth = YYMAXDEPTH;
  831.  
  832.     /*
  833.     ** Initialize externals - yyparse may be called more than once
  834.     */
  835.     yyv = (YYSTYPE*)malloc(yymaxdepth*sizeof(YYSTYPE));
  836.     yys = (int*)malloc(yymaxdepth*sizeof(int));
  837.     if (!yyv || !yys)
  838.     {
  839.         yyerror( "out of memory" );
  840.         return(1);
  841.     }
  842.     yypv = &yyv[-1];
  843.     yyps = &yys[-1];
  844.     yystate = 0;
  845.     yytmp = 0;
  846.     yynerrs = 0;
  847.     yyerrflag = 0;
  848.     yychar = -1;
  849.  
  850.     goto yystack;
  851.     {
  852.         register YYSTYPE *yy_pv;    /* top of value stack */
  853.         register int *yy_ps;        /* top of state stack */
  854.         register int yy_state;        /* current state */
  855.         register int  yy_n;        /* internal state number info */
  856.  
  857.         /*
  858.         ** get globals into registers.
  859.         ** branch to here only if YYBACKUP was called.
  860.         */
  861.     yynewstate:
  862.         yy_pv = yypv;
  863.         yy_ps = yyps;
  864.         yy_state = yystate;
  865.         goto yy_newstate;
  866.  
  867.         /*
  868.         ** get globals into registers.
  869.         ** either we just started, or we just finished a reduction
  870.         */
  871.     yystack:
  872.         yy_pv = yypv;
  873.         yy_ps = yyps;
  874.         yy_state = yystate;
  875.  
  876.         /*
  877.         ** top of for (;;) loop while no reductions done
  878.         */
  879.     yy_stack:
  880.         /*
  881.         ** put a state and value onto the stacks
  882.         */
  883. #if YYDEBUG
  884.         /*
  885.         ** if debugging, look up token value in list of value vs.
  886.         ** name pairs.  0 and negative (-1) are special values.
  887.         ** Note: linear search is used since time is not a real
  888.         ** consideration while debugging.
  889.         */
  890.         if ( yydebug )
  891.         {
  892.             register int yy_i;
  893.  
  894.             (void)printf( "State %d, token ", yy_state );
  895.             if ( yychar == 0 )
  896.                 (void)printf( "end-of-file\n" );
  897.             else if ( yychar < 0 )
  898.                 (void)printf( "-none-\n" );
  899.             else
  900.             {
  901.                 for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
  902.                     yy_i++ )
  903.                 {
  904.                     if ( yytoks[yy_i].t_val == yychar )
  905.                         break;
  906.                 }
  907.                 (void)printf( "%s\n", yytoks[yy_i].t_name );
  908.             }
  909.         }
  910. #endif /* YYDEBUG */
  911.         if ( ++yy_ps >= &yys[ yymaxdepth ] )    /* room on stack? */
  912.         {
  913.             /*
  914.             ** reallocate and recover.  Note that pointers
  915.             ** have to be reset, or bad things will happen
  916.             */
  917.             int yyps_index = (yy_ps - yys);
  918.             int yypv_index = (yy_pv - yyv);
  919.             int yypvt_index = (yypvt - yyv);
  920.             yymaxdepth += YYMAXDEPTH;
  921.             yyv = (YYSTYPE*)realloc((char*)yyv,
  922.                 yymaxdepth * sizeof(YYSTYPE));
  923.             yys = (int*)realloc((char*)yys,
  924.                 yymaxdepth * sizeof(int));
  925.             if (!yyv || !yys)
  926.             {
  927.                 yyerror( "yacc stack overflow" );
  928.                 return(1);
  929.             }
  930.             yy_ps = yys + yyps_index;
  931.             yy_pv = yyv + yypv_index;
  932.             yypvt = yyv + yypvt_index;
  933.         }
  934.         *yy_ps = yy_state;
  935.         *++yy_pv = yyval;
  936.  
  937.         /*
  938.         ** we have a new state - find out what to do
  939.         */
  940.     yy_newstate:
  941.         if ( ( yy_n = yypact[ yy_state ] ) <= YYFLAG )
  942.             goto yydefault;        /* simple state */
  943. #if YYDEBUG
  944.         /*
  945.         ** if debugging, need to mark whether new token grabbed
  946.         */
  947.         yytmp = yychar < 0;
  948. #endif
  949.         if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) )
  950.             yychar = 0;        /* reached EOF */
  951. #if YYDEBUG
  952.         if ( yydebug && yytmp )
  953.         {
  954.             register int yy_i;
  955.  
  956.             (void)printf( "Received token " );
  957.             if ( yychar == 0 )
  958.                 (void)printf( "end-of-file\n" );
  959.             else if ( yychar < 0 )
  960.                 (void)printf( "-none-\n" );
  961.             else
  962.             {
  963.                 for ( yy_i = 0; yytoks[yy_i].t_val >= 0;
  964.                     yy_i++ )
  965.                 {
  966.                     if ( yytoks[yy_i].t_val == yychar )
  967.                         break;
  968.                 }
  969.                 (void)printf( "%s\n", yytoks[yy_i].t_name );
  970.             }
  971.         }
  972. #endif /* YYDEBUG */
  973.         if ( ( ( yy_n += yychar ) < 0 ) || ( yy_n >= YYLAST ) )
  974.             goto yydefault;
  975.         if ( yychk[ yy_n = yyact[ yy_n ] ] == yychar )    /*valid shift*/
  976.         {
  977.             yychar = -1;
  978.             yyval = yylval;
  979.             yy_state = yy_n;
  980.             if ( yyerrflag > 0 )
  981.                 yyerrflag--;
  982.             goto yy_stack;
  983.         }
  984.  
  985.     yydefault:
  986.         if ( ( yy_n = yydef[ yy_state ] ) == -2 )
  987.         {
  988. #if YYDEBUG
  989.             yytmp = yychar < 0;
  990. #endif
  991.             if ( ( yychar < 0 ) && ( ( yychar = yylex() ) < 0 ) )
  992.                 yychar = 0;        /* reached EOF */
  993. #if YYDEBUG
  994.             if ( yydebug && yytmp )
  995.             {
  996.                 register int yy_i;
  997.  
  998.                 (void)printf( "Received token " );
  999.                 if ( yychar == 0 )
  1000.                     (void)printf( "end-of-file\n" );
  1001.                 else if ( yychar < 0 )
  1002.                     (void)printf( "-none-\n" );
  1003.                 else
  1004.                 {
  1005.                     for ( yy_i = 0;
  1006.                         yytoks[yy_i].t_val >= 0;
  1007.                         yy_i++ )
  1008.                     {
  1009.                         if ( yytoks[yy_i].t_val
  1010.                             == yychar )
  1011.                         {
  1012.                             break;
  1013.                         }
  1014.                     }
  1015.                     (void)printf( "%s\n", yytoks[yy_i].t_name );
  1016.                 }
  1017.             }
  1018. #endif /* YYDEBUG */
  1019.             /*
  1020.             ** look through exception table
  1021.             */
  1022.             {
  1023.                 register int *yyxi = yyexca;
  1024.  
  1025.                 while ( ( *yyxi != -1 ) ||
  1026.                     ( yyxi[1] != yy_state ) )
  1027.                 {
  1028.                     yyxi += 2;
  1029.                 }
  1030.                 while ( ( *(yyxi += 2) >= 0 ) &&
  1031.                     ( *yyxi != yychar ) )
  1032.                     ;
  1033.                 if ( ( yy_n = yyxi[1] ) < 0 )
  1034.                     YYACCEPT;
  1035.             }
  1036.         }
  1037.  
  1038.         /*
  1039.         ** check for syntax error
  1040.         */
  1041.         if ( yy_n == 0 )    /* have an error */
  1042.         {
  1043.             /* no worry about speed here! */
  1044.             switch ( yyerrflag )
  1045.             {
  1046.             case 0:        /* new error */
  1047.                 yyerror( "syntax error" );
  1048.                 goto skip_init;
  1049.             yyerrlab:
  1050.                 /*
  1051.                 ** get globals into registers.
  1052.                 ** we have a user generated syntax type error
  1053.                 */
  1054.                 yy_pv = yypv;
  1055.                 yy_ps = yyps;
  1056.                 yy_state = yystate;
  1057.                 yynerrs++;
  1058.             skip_init:
  1059.             case 1:
  1060.             case 2:        /* incompletely recovered error */
  1061.                     /* try again... */
  1062.                 yyerrflag = 3;
  1063.                 /*
  1064.                 ** find state where "error" is a legal
  1065.                 ** shift action
  1066.                 */
  1067.                 while ( yy_ps >= yys )
  1068.                 {
  1069.                     yy_n = yypact[ *yy_ps ] + YYERRCODE;
  1070.                     if ( yy_n >= 0 && yy_n < YYLAST &&
  1071.                         yychk[yyact[yy_n]] == YYERRCODE)                    {
  1072.                         /*
  1073.                         ** simulate shift of "error"
  1074.                         */
  1075.                         yy_state = yyact[ yy_n ];
  1076.                         goto yy_stack;
  1077.                     }
  1078.                     /*
  1079.                     ** current state has no shift on
  1080.                     ** "error", pop stack
  1081.                     */
  1082. #if YYDEBUG
  1083. #    define _POP_ "Error recovery pops state %d, uncovers state %d\n"
  1084.                     if ( yydebug )
  1085.                         (void)printf( _POP_, *yy_ps,
  1086.                             yy_ps[-1] );
  1087. #    undef _POP_
  1088. #endif
  1089.                     yy_ps--;
  1090.                     yy_pv--;
  1091.                 }
  1092.                 /*
  1093.                 ** there is no state on stack with "error" as
  1094.                 ** a valid shift.  give up.
  1095.                 */
  1096.                 YYABORT;
  1097.             case 3:        /* no shift yet; eat a token */
  1098. #if YYDEBUG
  1099.                 /*
  1100.                 ** if debugging, look up token in list of
  1101.                 ** pairs.  0 and negative shouldn't occur,
  1102.                 ** but since timing doesn't matter when
  1103.                 ** debugging, it doesn't hurt to leave the
  1104.                 ** tests here.
  1105.                 */
  1106.                 if ( yydebug )
  1107.                 {
  1108.                     register int yy_i;
  1109.  
  1110.                     (void)printf( "Error recovery discards " );
  1111.                     if ( yychar == 0 )
  1112.                         (void)printf( "token end-of-file\n" );
  1113.                     else if ( yychar < 0 )
  1114.                         (void)printf( "token -none-\n" );
  1115.                     else
  1116.                     {
  1117.                         for ( yy_i = 0;
  1118.                             yytoks[yy_i].t_val >= 0;
  1119.                             yy_i++ )
  1120.                         {
  1121.                             if ( yytoks[yy_i].t_val
  1122.                                 == yychar )
  1123.                             {
  1124.                                 break;
  1125.                             }
  1126.                         }
  1127.                         (void)printf( "token %s\n",
  1128.                             yytoks[yy_i].t_name );
  1129.                     }
  1130.                 }
  1131. #endif /* YYDEBUG */
  1132.                 if ( yychar == 0 )    /* reached EOF. quit */
  1133.                     YYABORT;
  1134.                 yychar = -1;
  1135.                 goto yy_newstate;
  1136.             }
  1137.         }/* end if ( yy_n == 0 ) */
  1138.         /*
  1139.         ** reduction by production yy_n
  1140.         ** put stack tops, etc. so things right after switch
  1141.         */
  1142. #if YYDEBUG
  1143.         /*
  1144.         ** if debugging, print the string that is the user's
  1145.         ** specification of the reduction which is just about
  1146.         ** to be done.
  1147.         */
  1148.         if ( yydebug )
  1149.             (void)printf( "Reduce by (%d) \"%s\"\n",
  1150.                 yy_n, yyreds[ yy_n ] );
  1151. #endif
  1152.         yytmp = yy_n;            /* value to switch over */
  1153.         yypvt = yy_pv;            /* $vars top of value stack */
  1154.         /*
  1155.         ** Look in goto table for next state
  1156.         ** Sorry about using yy_state here as temporary
  1157.         ** register variable, but why not, if it works...
  1158.         ** If yyr2[ yy_n ] doesn't have the low order bit
  1159.         ** set, then there is no action to be done for
  1160.         ** this reduction.  So, no saving & unsaving of
  1161.         ** registers done.  The only difference between the
  1162.         ** code just after the if and the body of the if is
  1163.         ** the goto yy_stack in the body.  This way the test
  1164.         ** can be made before the choice of what to do is needed.
  1165.         */
  1166.         {
  1167.             /* length of production doubled with extra bit */
  1168.             register int yy_len = yyr2[ yy_n ];
  1169.  
  1170.             if ( !( yy_len & 01 ) )
  1171.             {
  1172.                 yy_len >>= 1;
  1173.                 yyval = ( yy_pv -= yy_len )[1];    /* $$ = $1 */
  1174.                 yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] +
  1175.                     *( yy_ps -= yy_len ) + 1;
  1176.                 if ( yy_state >= YYLAST ||
  1177.                     yychk[ yy_state =
  1178.                     yyact[ yy_state ] ] != -yy_n )
  1179.                 {
  1180.                     yy_state = yyact[ yypgo[ yy_n ] ];
  1181.                 }
  1182.                 goto yy_stack;
  1183.             }
  1184.             yy_len >>= 1;
  1185.             yyval = ( yy_pv -= yy_len )[1];    /* $$ = $1 */
  1186.             yy_state = yypgo[ yy_n = yyr1[ yy_n ] ] +
  1187.                 *( yy_ps -= yy_len ) + 1;
  1188.             if ( yy_state >= YYLAST ||
  1189.                 yychk[ yy_state = yyact[ yy_state ] ] != -yy_n )
  1190.             {
  1191.                 yy_state = yyact[ yypgo[ yy_n ] ];
  1192.             }
  1193.         }
  1194.                     /* save until reenter driver code */
  1195.         yystate = yy_state;
  1196.         yyps = yy_ps;
  1197.         yypv = yy_pv;
  1198.     }
  1199.     /*
  1200.     ** code supplied by user is placed in this switch
  1201.     */
  1202.     switch( yytmp )
  1203.     {
  1204.         
  1205. case 1:
  1206. # line 120 "gram.y"
  1207. {
  1208.         objdefined = FALSE;
  1209.       } break;
  1210. case 4:
  1211. # line 126 "gram.y"
  1212. {
  1213.         object    *obj, *head;
  1214.  
  1215.         if ((head = objectinit(yypvt[-0].y_det->u.obj.sym, yypvt[-0].y_det->u.obj.det)) != (object *)NULL) {
  1216.             for (obj = head; obj->nxt != (object *)NULL; obj = obj->nxt)    
  1217.                 ;
  1218.  
  1219.             obj->nxt = oblist;
  1220.             oblist = head;
  1221.         }
  1222.  
  1223.         objdefined = TRUE;
  1224.  
  1225.         free(yypvt[-0].y_det);
  1226.       } break;
  1227. case 6:
  1228. # line 143 "gram.y"
  1229. {
  1230.         objdefined = TRUE;
  1231.  
  1232.         free(yypvt[-0].y_det);
  1233.       } break;
  1234. case 8:
  1235. # line 152 "gram.y"
  1236. {
  1237.         float   val;
  1238.  
  1239.         val = eval_fexpr(yypvt[-0].y_exp);
  1240.  
  1241.         if (val == 0.0 || val == 360.0)
  1242.             fatal("art: idiotic angle in field of view.\n");
  1243.  
  1244.         near = 1.0 / tan(M_PI / 360.0 * val);
  1245.  
  1246.         fov = val;
  1247.       } break;
  1248. case 9:
  1249. # line 165 "gram.y"
  1250. {
  1251.         screenx = eval_fexpr(yypvt[-2].y_exp) / 2.0;
  1252.         screeny = eval_fexpr(yypvt[-0].y_exp) / 2.0;
  1253.       } break;
  1254. case 16:
  1255. # line 176 "gram.y"
  1256. {
  1257.         orthographic = FALSE;
  1258.       } break;
  1259. case 17:
  1260. # line 180 "gram.y"
  1261. {
  1262.         orthographic = TRUE;
  1263.       } break;
  1264. case 21:
  1265. # line 187 "gram.y"
  1266. {
  1267.         viewup.x = eval_fexpr(yypvt[-5].y_exp);
  1268.         viewup.y = eval_fexpr(yypvt[-3].y_exp);
  1269.         viewup.z = eval_fexpr(yypvt[-1].y_exp);
  1270.  
  1271.       } break;
  1272. case 22:
  1273. # line 194 "gram.y"
  1274. {
  1275.         vector    t, u, s;
  1276.         matrix    m, tmp;
  1277.         double    val, vy, vz, sinval, cosval;
  1278.  
  1279.         twist = -eval_fexpr(yypvt[-1].y_exp);
  1280.  
  1281.         eye.x = eval_fexpr(yypvt[-13].y_exp);
  1282.         eye.y = eval_fexpr(yypvt[-11].y_exp);
  1283.         eye.z = eval_fexpr(yypvt[-9].y_exp);
  1284.  
  1285.         ref.x = eval_fexpr(yypvt[-7].y_exp);
  1286.         ref.y = eval_fexpr(yypvt[-5].y_exp);
  1287.         ref.z = eval_fexpr(yypvt[-3].y_exp);
  1288.  
  1289.         fprintf(stderr, "eye: %f %f %f\n", eye.x, eye.y, eye.z);
  1290.         fprintf(stderr, "ref: %f %f %f\n", ref.x, ref.y, ref.z);
  1291.         fprintf(stderr, "twist: %f\n", twist);
  1292.         fprintf(stderr, "fov: %f\n", fov);
  1293.  
  1294.       } break;
  1295. case 41:
  1296. # line 242 "gram.y"
  1297. {
  1298.         yyval.y_det = (details *)smalloc(sizeof(details));
  1299.         yyval.y_det->type = OBJECT;
  1300.         yyval.y_det->u.obj.sym = yypvt[-3].y_sym;
  1301.         yyval.y_det->u.obj.det = yypvt[-1].y_det;
  1302.         yyval.y_det->nxt = (details *)NULL;
  1303.       } break;
  1304. case 42:
  1305. # line 250 "gram.y"
  1306. {
  1307.         yyval.y_det = (details *)smalloc(sizeof(details));
  1308.         yyval.y_det->type = OBJECT;
  1309.         yyval.y_det->u.obj.sym = yypvt[-0].y_sym;
  1310.         yyval.y_det->u.obj.det = (details *)NULL;
  1311.         yyval.y_det->nxt = (details *)NULL;
  1312.       } break;
  1313. case 43:
  1314. # line 258 "gram.y"
  1315. {
  1316.         yyval.y_det = (details *)smalloc(sizeof(details));
  1317.         yyval.y_det->type = COMP_OBJ;
  1318.         yyval.y_det->u.obj.sym = (symbol *)NULL;
  1319.         yyval.y_det->u.obj.det = yypvt[-1].y_det;
  1320.         yyval.y_det->nxt = (details *)NULL;
  1321.       } break;
  1322. case 44:
  1323. # line 266 "gram.y"
  1324. {
  1325.         ostackp++;
  1326.         *ostackp = (symbol *)NULL;
  1327.       } break;
  1328. case 45:
  1329. # line 271 "gram.y"
  1330. {
  1331.         details    *d;
  1332.         symbol    *s;
  1333.  
  1334.         ostackp--;
  1335.  
  1336.         d = (details *)smalloc(sizeof(details));
  1337.         d->type = yypvt[-2].y_det->type;
  1338.         d->u.csgobj.tree = yypvt[-1].y_csg;
  1339.         d->u.csgobj.det = yypvt[-2].y_det;
  1340.         d->nxt = (details *)NULL;
  1341.  
  1342.         s = (symbol *)smalloc(sizeof(symbol));
  1343.         s->type = CSG_OBJ;
  1344.         s->u.det = d;
  1345.  
  1346.         yyval.y_det = (details *)smalloc(sizeof(details));
  1347.         yyval.y_det->type = OBJECT;
  1348.         yyval.y_det->u.obj.sym = s;
  1349.         yyval.y_det->u.obj.det = (details *)NULL;
  1350.         yyval.y_det->nxt = (details *)NULL;
  1351.       } break;
  1352. case 46:
  1353. # line 296 "gram.y"
  1354. {
  1355.         yyval.y_det = (details *)NULL;
  1356.       } break;
  1357. case 47:
  1358. # line 300 "gram.y"
  1359. {
  1360.         yyval.y_det = yypvt[-0].y_det;
  1361.         yypvt[-0].y_det->nxt = yypvt[-1].y_det;
  1362.       } break;
  1363. case 48:
  1364. # line 305 "gram.y"
  1365. {
  1366.         yyval.y_det = yypvt[-0].y_det;
  1367.         yypvt[-0].y_det->nxt = yypvt[-1].y_det;
  1368.       } break;
  1369. case 49:
  1370. # line 310 "gram.y"
  1371. {
  1372.         yyval.y_det = yypvt[-0].y_det;
  1373.         yypvt[-0].y_det->nxt = yypvt[-1].y_det;
  1374.       } break;
  1375. case 50:
  1376. # line 317 "gram.y"
  1377. {
  1378.         defvar(yypvt[-2].y_str, yypvt[-0].y_exp);
  1379.       } break;
  1380. case 51:
  1381. # line 321 "gram.y"
  1382. {
  1383.         switch (yypvt[-0].y_det->type) {
  1384.         case ART_TRANSLATE:
  1385.             translate(yypvt[-0].y_det->u.v.x, yypvt[-0].y_det->u.v.y, yypvt[-0].y_det->u.v.z);
  1386.             break;
  1387.         case ART_SCALE:
  1388.             scale(yypvt[-0].y_det->u.v.x, yypvt[-0].y_det->u.v.y, yypvt[-0].y_det->u.v.z);
  1389.             break;
  1390.         case ART_ROTATE:
  1391.             rotate(yypvt[-0].y_det->u.rot.ang, yypvt[-0].y_det->u.rot.axis);
  1392.             break;
  1393.         default:
  1394.             fatal("art: bad transform type in switch.\n");
  1395.         }
  1396.  
  1397.         free(yypvt[-0].y_det);
  1398.       } break;
  1399. case 52:
  1400. # line 339 "gram.y"
  1401. {
  1402.         surface    *s;
  1403.  
  1404.             /*
  1405.              * don't want to change someone else's
  1406.              * material properties
  1407.              */
  1408.         if (objdefined) {
  1409.             s = (surface *)smalloc(sizeof(surface));
  1410.             *s = *astackp->s;
  1411.             astackp->s = s;
  1412.         } else
  1413.             s = astackp->s;
  1414.  
  1415.         switch (yypvt[-0].y_det->type) {
  1416.         case COLOUR:
  1417.             s->c.r = yypvt[-0].y_det->u.c.r;
  1418.             s->c.g = yypvt[-0].y_det->u.c.g;
  1419.             s->c.b = yypvt[-0].y_det->u.c.b;
  1420.             break;
  1421.         case AMBIENT:
  1422.             s->a.r = yypvt[-0].y_det->u.c.r;
  1423.             s->a.g = yypvt[-0].y_det->u.c.g;
  1424.             s->a.b = yypvt[-0].y_det->u.c.b;
  1425.             break;
  1426.         case TEXTURE:
  1427.             break;
  1428.         case MATERIAL:
  1429.             s->ri = yypvt[-0].y_det->u.mat.ri;
  1430.             s->kd = yypvt[-0].y_det->u.mat.kd;
  1431.             s->ks = yypvt[-0].y_det->u.mat.ks;
  1432.             s->ksexp = yypvt[-0].y_det->u.mat.ksexp;
  1433.             break;
  1434.         case REFLECTANCE:
  1435.             s->refl = yypvt[-0].y_det->u.f;
  1436.             break;
  1437.         case TRANSPARENCY:
  1438.             s->trans = yypvt[-0].y_det->u.f;
  1439.             break;
  1440.         case ABSORPTION:
  1441.             s->falloff = yypvt[-0].y_det->u.f;
  1442.             break;
  1443.         case ON:
  1444.             astackp->options |= yypvt[-0].y_det->u.i;
  1445.             break;
  1446.         case OFF:
  1447.             astackp->options &= ~yypvt[-0].y_det->u.i;
  1448.             break;
  1449.         default:
  1450.             fatal("art: bad statement type in switch.\n");
  1451.         }
  1452.  
  1453.         free(yypvt[-0].y_det);
  1454.       } break;
  1455. case 53:
  1456. # line 394 "gram.y"
  1457. {
  1458.         dorepeat(yypvt[-3].y_exp, yypvt[-1].y_det);
  1459.       } break;
  1460. case 54:
  1461. # line 400 "gram.y"
  1462. {
  1463.         yyval.y_det = (details *)NULL;
  1464.       } break;
  1465. case 55:
  1466. # line 404 "gram.y"
  1467. {
  1468.         yypvt[-0].y_det->nxt = yypvt[-1].y_det;
  1469.         yyval.y_det = yypvt[-0].y_det;
  1470.       } break;
  1471. case 56:
  1472. # line 409 "gram.y"
  1473. {
  1474.         yyval.y_det = (details *)smalloc(sizeof(details));
  1475.  
  1476.         yyval.y_det->type = OBJECT;
  1477.         yyval.y_det->u.sym = yypvt[-0].y_sym;
  1478.         yyval.y_det->nxt = yypvt[-1].y_det;
  1479.       } break;
  1480. case 57:
  1481. # line 417 "gram.y"
  1482. {
  1483.         yyval.y_det = (details *)smalloc(sizeof(details));
  1484.  
  1485.         yyval.y_det->type = REPEAT;
  1486.         yyval.y_det->u.rpt.expr = yypvt[-3].y_exp;
  1487.         yyval.y_det->u.rpt.stmt = yypvt[-1].y_det;
  1488.         yyval.y_det->nxt = yypvt[-5].y_det;
  1489.       } break;
  1490. case 58:
  1491. # line 429 "gram.y"
  1492. {
  1493.         yyval.y_det = (details *)NULL;
  1494.       } break;
  1495. case 59:
  1496. # line 433 "gram.y"
  1497. {
  1498.         yypvt[-0].y_det->nxt = yypvt[-1].y_det;
  1499.         yyval.y_det = yypvt[-0].y_det;
  1500.       } break;
  1501. case 60:
  1502. # line 438 "gram.y"
  1503. {
  1504.         yypvt[-0].y_det->nxt = yypvt[-1].y_det;
  1505.         yyval.y_det = yypvt[-0].y_det;
  1506.       } break;
  1507. case 61:
  1508. # line 445 "gram.y"
  1509. {
  1510.         yyval.y_det = (details *)smalloc(sizeof(details));
  1511.         yyval.y_det->type = CENTER;
  1512.         yyval.y_det->u.v.x = eval_fexpr(yypvt[-5].y_exp);
  1513.         yyval.y_det->u.v.y = eval_fexpr(yypvt[-3].y_exp);
  1514.         yyval.y_det->u.v.z = eval_fexpr(yypvt[-1].y_exp);
  1515.         yyval.y_det->nxt = (details *)NULL;
  1516.       } break;
  1517. case 62:
  1518. # line 454 "gram.y"
  1519. {
  1520.         yyval.y_det = (details *)smalloc(sizeof(details));
  1521.         yyval.y_det->type = ORDER;
  1522.         yyval.y_det->u.i = eval_iexpr(yypvt[-0].y_exp);
  1523.         yyval.y_det->nxt = (details *)NULL;
  1524.       } break;
  1525. case 63:
  1526. # line 461 "gram.y"
  1527. {
  1528.         yyval.y_det = (details *)smalloc(sizeof(details));
  1529.         yyval.y_det->type = RADIUS;
  1530.         yyval.y_det->u.f = eval_fexpr(yypvt[-0].y_exp);
  1531.         yyval.y_det->nxt = (details *)NULL;
  1532.       } break;
  1533. case 64:
  1534. # line 468 "gram.y"
  1535. {
  1536.         yyval.y_det = (details *)smalloc(sizeof(details));
  1537.         yyval.y_det->type = RADII;
  1538.         yyval.y_det->u.v.x = eval_fexpr(yypvt[-2].y_exp);
  1539.         yyval.y_det->u.v.y = eval_fexpr(yypvt[-0].y_exp);
  1540.         yyval.y_det->nxt = (details *)NULL;
  1541.       } break;
  1542. case 65:
  1543. # line 476 "gram.y"
  1544. {
  1545.         yyval.y_det = (details *)smalloc(sizeof(details));
  1546.         yyval.y_det->type = RADII;
  1547.         yyval.y_det->u.v.x = eval_fexpr(yypvt[-4].y_exp);
  1548.         yyval.y_det->u.v.y = eval_fexpr(yypvt[-2].y_exp);
  1549.         yyval.y_det->u.v.z = eval_fexpr(yypvt[-0].y_exp);
  1550.         yyval.y_det->nxt = (details *)NULL;
  1551.       } break;
  1552. case 66:
  1553. # line 485 "gram.y"
  1554. {
  1555.         if (yypvt[-0].y_det->nxt == (details *)NULL) {
  1556.             yypvt[-0].y_det->type = VERTEX;
  1557.             yyval.y_det = yypvt[-0].y_det;
  1558.         } else {
  1559.             yyval.y_det = (details *)smalloc(sizeof(details));
  1560.             yyval.y_det->type = COMPLEXVERTEX;
  1561.             yyval.y_det->u.det = yypvt[-0].y_det;
  1562.             yyval.y_det->nxt = (details *)NULL;
  1563.         }
  1564.       } break;
  1565. case 67:
  1566. # line 497 "gram.y"
  1567. {
  1568.         yyval.y_det = (details *)smalloc(sizeof(details));
  1569.         yyval.y_det->type = EQUATION;
  1570.         yyval.y_det->u.t = (term *)smalloc(sizeof(term));
  1571.         yyval.y_det->u.t->coef = -eval_fexpr(yypvt[-1].y_exp);
  1572.         yyval.y_det->u.t->xp = 0;
  1573.         yyval.y_det->u.t->yp = 0;
  1574.         yyval.y_det->u.t->zp = 0;
  1575.         yyval.y_det->u.t->nxt = yypvt[-3].y_trm;
  1576.         yyval.y_det->nxt = (details *)NULL;
  1577.       } break;
  1578. case 68:
  1579. # line 509 "gram.y"
  1580. {
  1581.         yyval.y_det = (details *)smalloc(sizeof(details));
  1582.         yyval.y_det->type = COEFFS;
  1583.         yyval.y_det->u.v.x = eval_fexpr(yypvt[-4].y_exp);
  1584.         yyval.y_det->u.v.y = eval_fexpr(yypvt[-2].y_exp);
  1585.         yyval.y_det->u.v.z = eval_fexpr(yypvt[-0].y_exp);
  1586.         yyval.y_det->nxt = (details *)NULL;
  1587.       } break;
  1588. case 69:
  1589. # line 518 "gram.y"
  1590. {
  1591.         yyval.y_det = (details *)smalloc(sizeof(details));
  1592.         yyval.y_det->type = CONST;
  1593.         yyval.y_det->u.f = eval_fexpr(yypvt[-0].y_exp);
  1594.         yyval.y_det->nxt = (details *)NULL;
  1595.       } break;
  1596. case 70:
  1597. # line 525 "gram.y"
  1598. {
  1599.         yyval.y_det = (details *)smalloc(sizeof(details));
  1600.         yyval.y_det->type = TOP;
  1601.         yyval.y_det->u.f = eval_fexpr(yypvt[-0].y_exp);
  1602.         yyval.y_det->nxt = (details *)NULL;
  1603.       } break;
  1604. case 71:
  1605. # line 532 "gram.y"
  1606. {
  1607.         yyval.y_det = (details *)smalloc(sizeof(details));
  1608.         yyval.y_det->type = BASE;
  1609.         yyval.y_det->u.f = eval_fexpr(yypvt[-0].y_exp);
  1610.         yyval.y_det->nxt = (details *)NULL;
  1611.       } break;
  1612. case 72:
  1613. # line 539 "gram.y"
  1614. {
  1615.         yyval.y_det = (details *)smalloc(sizeof(details));
  1616.         yyval.y_det->type = OFFFILE;
  1617.         yyval.y_det->u.s = yypvt[-0].y_str;
  1618.         yyval.y_det->nxt = (details *)NULL;
  1619.       } break;
  1620. case 73:
  1621. # line 546 "gram.y"
  1622. {
  1623.         yyval.y_det = (details *)smalloc(sizeof(details));
  1624.         yyval.y_det->type = COLOURFILE;
  1625.         yyval.y_det->u.s = yypvt[-0].y_str;
  1626.         yyval.y_det->nxt = (details *)NULL;
  1627.       } break;
  1628. case 74:
  1629. # line 553 "gram.y"
  1630. {
  1631.         yyval.y_det = (details *)smalloc(sizeof(details));
  1632.         yyval.y_det->type = VNORMALFILE;
  1633.         yyval.y_det->u.s = yypvt[-0].y_str;
  1634.         yyval.y_det->nxt = (details *)NULL;
  1635.       } break;
  1636. case 75:
  1637. # line 560 "gram.y"
  1638. {
  1639.         yyval.y_det = (details *)smalloc(sizeof(details));
  1640.         yyval.y_det->type = NORMALFILE;
  1641.         yyval.y_det->u.s = yypvt[-0].y_str;
  1642.         yyval.y_det->nxt = (details *)NULL;
  1643.       } break;
  1644. case 76:
  1645. # line 567 "gram.y"
  1646. {
  1647.         yyval.y_det = (details *)smalloc(sizeof(details));
  1648.         yyval.y_det->type = COLOUR;
  1649.         yyval.y_det->u.c.r = eval_fexpr(yypvt[-4].y_exp);
  1650.         yyval.y_det->u.c.g = eval_fexpr(yypvt[-2].y_exp);
  1651.         yyval.y_det->u.c.b = eval_fexpr(yypvt[-0].y_exp);
  1652.         yyval.y_det->nxt = (details *)NULL;
  1653.       } break;
  1654. case 77:
  1655. # line 576 "gram.y"
  1656. {
  1657.         yyval.y_det = (details *)smalloc(sizeof(details));
  1658.         yyval.y_det->type = MATERIAL;
  1659.         yyval.y_det->u.mat.ri = eval_fexpr(yypvt[-6].y_exp);
  1660.         yyval.y_det->u.mat.kd = eval_fexpr(yypvt[-4].y_exp);
  1661.         yyval.y_det->u.mat.ks = eval_fexpr(yypvt[-2].y_exp);
  1662.         yyval.y_det->u.mat.ksexp = eval_iexpr(yypvt[-0].y_exp);
  1663.         yyval.y_det->nxt = (details *)NULL;
  1664.       } break;
  1665. case 78:
  1666. # line 586 "gram.y"
  1667. {
  1668.         yyval.y_det = (details *)smalloc(sizeof(details));
  1669.         yyval.y_det->type = AMBIENT;
  1670.         yyval.y_det->u.v.x = eval_fexpr(yypvt[-4].y_exp);
  1671.         yyval.y_det->u.v.y = eval_fexpr(yypvt[-2].y_exp);
  1672.         yyval.y_det->u.v.z = eval_fexpr(yypvt[-0].y_exp);
  1673.         yyval.y_det->nxt = (details *)NULL;
  1674.       } break;
  1675. case 79:
  1676. # line 595 "gram.y"
  1677. {
  1678.         yyval.y_det = (details *)smalloc(sizeof(details));
  1679.         yyval.y_det->type = REFLECTANCE;
  1680.         yyval.y_det->u.f = eval_fexpr(yypvt[-0].y_exp);
  1681.         yyval.y_det->nxt = (details *)NULL;
  1682.       } break;
  1683. case 80:
  1684. # line 602 "gram.y"
  1685. {
  1686.         yyval.y_det = (details *)smalloc(sizeof(details));
  1687.         yyval.y_det->type = TRANSPARENCY;
  1688.         yyval.y_det->u.f = eval_fexpr(yypvt[-0].y_exp);
  1689.         yyval.y_det->nxt = (details *)NULL;
  1690.       } break;
  1691. case 81:
  1692. # line 609 "gram.y"
  1693. {
  1694.         yyval.y_det = (details *)smalloc(sizeof(details));
  1695.         yyval.y_det->type = ABSORPTION;
  1696.         yyval.y_det->u.f = eval_fexpr(yypvt[-0].y_exp);
  1697.         yyval.y_det->nxt = (details *)NULL;
  1698.       } break;
  1699. case 82:
  1700. # line 616 "gram.y"
  1701. {
  1702.         yyval.y_det = (details *)smalloc(sizeof(details));
  1703.         yyval.y_det->type = ON;
  1704.         yyval.y_det->u.i = yypvt[-1].y_int;
  1705.         yyval.y_det->nxt = (details *)NULL;
  1706.       } break;
  1707. case 83:
  1708. # line 623 "gram.y"
  1709. {
  1710.         yyval.y_det = (details *)smalloc(sizeof(details));
  1711.         yyval.y_det->type = OFF;
  1712.         yyval.y_det->u.i = yypvt[-1].y_int;
  1713.         yyval.y_det->nxt = (details *)NULL;
  1714.       } break;
  1715. case 84:
  1716. # line 630 "gram.y"
  1717. {
  1718.         yyval.y_det = (details *)smalloc(sizeof(details));
  1719.         yyval.y_det->type = TEXTURE;
  1720.         yyval.y_det->nxt = (details *)NULL;
  1721.       } break;
  1722. case 85:
  1723. # line 636 "gram.y"
  1724. {
  1725.         yyval.y_det = (details *)smalloc(sizeof(details));
  1726.         yyval.y_det->type = TEXTURE;
  1727.         yyval.y_det->nxt = (details *)NULL;
  1728.       } break;
  1729. case 86:
  1730. # line 642 "gram.y"
  1731. {
  1732.         yyval.y_det = (details *)smalloc(sizeof(details));
  1733.         yyval.y_det->type = TEXTURE;
  1734.         yyval.y_det->nxt = (details *)NULL;
  1735.       } break;
  1736. case 87:
  1737. # line 648 "gram.y"
  1738. {
  1739.         yyval.y_det = (details *)smalloc(sizeof(details));
  1740.         yyval.y_det->type = TEXTURE;
  1741.         yyval.y_det->nxt = (details *)NULL;
  1742.       } break;
  1743. case 88:
  1744. # line 654 "gram.y"
  1745. {
  1746.         details    *d1, *d2;
  1747.  
  1748.         d1 = (details *)smalloc(sizeof(details));
  1749.         d1->type = VORTFILE;
  1750.         d1->u.s = yypvt[-4].y_str;
  1751.  
  1752.         d2 = (details *)smalloc(sizeof(details));
  1753.         d2->type = SIZE;
  1754.         d2->u.v.x = eval_fexpr(yypvt[-2].y_exp);
  1755.         d2->u.v.y = eval_fexpr(yypvt[-0].y_exp);
  1756.  
  1757.         d1->nxt = d2;
  1758.         d2->nxt = (details *)NULL;
  1759.  
  1760.         yyval.y_det = (details *)smalloc(sizeof(details));
  1761.         yyval.y_det->type = TEXTURE;
  1762.         yyval.y_det->nxt = (details *)NULL;
  1763.       } break;
  1764. case 89:
  1765. # line 676 "gram.y"
  1766. {
  1767.         yyval.y_det = yypvt[-0].y_det;
  1768.       } break;
  1769. case 90:
  1770. # line 680 "gram.y"
  1771. {
  1772.         yypvt[-0].y_det->nxt = yypvt[-2].y_det;
  1773.         yyval.y_det = yypvt[-0].y_det;
  1774.       } break;
  1775. case 91:
  1776. # line 687 "gram.y"
  1777. {
  1778.         yyval.y_det = (details *)smalloc(sizeof(details));
  1779.         yyval.y_det->type = VERTEX;
  1780.         yyval.y_det->u.v.x = eval_fexpr(yypvt[-5].y_exp);
  1781.         yyval.y_det->u.v.y = eval_fexpr(yypvt[-3].y_exp);
  1782.         yyval.y_det->u.v.z = eval_fexpr(yypvt[-1].y_exp);
  1783.         yyval.y_det->nxt = (details *)NULL;
  1784.       } break;
  1785. case 92:
  1786. # line 696 "gram.y"
  1787. {
  1788.         yyval.y_det = (details *)smalloc(sizeof(details));
  1789.         yyval.y_det->type = COLOUR;
  1790.         yyval.y_det->u.v.x = eval_fexpr(yypvt[-4].y_exp);
  1791.         yyval.y_det->u.v.y = eval_fexpr(yypvt[-2].y_exp);
  1792.         yyval.y_det->u.v.z = eval_fexpr(yypvt[-0].y_exp);
  1793.         yyval.y_det->nxt = (details *)NULL;
  1794.       } break;
  1795. case 93:
  1796. # line 706 "gram.y"
  1797. {
  1798.         yyval.y_det = (details *)smalloc(sizeof(details));
  1799.         yyval.y_det->type = ART_ROTATE;
  1800.         yyval.y_det->u.rot.ang = eval_fexpr(yypvt[-3].y_exp);
  1801.         yyval.y_det->u.rot.axis = eval_iexpr(yypvt[-1].y_exp);
  1802.         yyval.y_det->nxt = (details *)NULL;
  1803.       } break;
  1804. case 94:
  1805. # line 714 "gram.y"
  1806. {
  1807.         yyval.y_det = (details *)smalloc(sizeof(details));
  1808.         yyval.y_det->type = ART_TRANSLATE;
  1809.         yyval.y_det->u.v.x = eval_fexpr(yypvt[-5].y_exp);
  1810.         yyval.y_det->u.v.y = eval_fexpr(yypvt[-3].y_exp);
  1811.         yyval.y_det->u.v.z = eval_fexpr(yypvt[-1].y_exp);
  1812.         yyval.y_det->nxt = (details *)NULL;
  1813.       } break;
  1814. case 95:
  1815. # line 723 "gram.y"
  1816. {
  1817.         yyval.y_det = (details *)smalloc(sizeof(details));
  1818.         yyval.y_det->type = ART_SCALE;
  1819.         yyval.y_det->u.v.x = eval_fexpr(yypvt[-5].y_exp);
  1820.         yyval.y_det->u.v.y = eval_fexpr(yypvt[-3].y_exp);
  1821.         yyval.y_det->u.v.z = eval_fexpr(yypvt[-1].y_exp);
  1822.         yyval.y_det->nxt = (details *)NULL;
  1823.       } break;
  1824. case 111:
  1825. # line 753 "gram.y"
  1826. {
  1827.         yyval.y_det = (details *)NULL;
  1828.     } break;
  1829. case 112:
  1830. # line 757 "gram.y"
  1831. {
  1832.         yypvt[-0].y_det->nxt = yypvt[-2].y_det;
  1833.         yyval.y_det = yypvt[-0].y_det;
  1834.     } break;
  1835. case 113:
  1836. # line 764 "gram.y"
  1837. {
  1838.                 yyval.y_det = (details *)smalloc(sizeof(details));
  1839.                 yyval.y_det->type = MAPVALUES;
  1840.                 yyval.y_det->u.v.x = eval_fexpr(yypvt[-4].y_exp);
  1841.                 yyval.y_det->u.v.y = eval_fexpr(yypvt[-2].y_exp);
  1842.                 yyval.y_det->u.v.z = eval_fexpr(yypvt[-0].y_exp);
  1843.                 yyval.y_det->nxt = (details *)NULL;
  1844.       } break;
  1845. case 114:
  1846. # line 774 "gram.y"
  1847. {
  1848.                 yyval.y_det = (details *)NULL;
  1849.           } break;
  1850. case 115:
  1851. # line 778 "gram.y"
  1852. {
  1853.                 yypvt[-0].y_det->nxt = yypvt[-1].y_det;
  1854.                 yyval.y_det = yypvt[-0].y_det;
  1855.           } break;
  1856. case 116:
  1857. # line 785 "gram.y"
  1858. {
  1859.                 yyval.y_det = (details *)smalloc(sizeof(details));
  1860.                 yyval.y_det->type = CENTER;
  1861.                 yyval.y_det->u.v.x = eval_fexpr(yypvt[-5].y_exp);
  1862.                 yyval.y_det->u.v.y = eval_fexpr(yypvt[-3].y_exp);
  1863.                 yyval.y_det->u.v.z = eval_fexpr(yypvt[-1].y_exp);
  1864.                 yyval.y_det->nxt = (details *)NULL;
  1865.       } break;
  1866. case 117:
  1867. # line 794 "gram.y"
  1868. {
  1869.                 yyval.y_det = (details *)smalloc(sizeof(details));
  1870.                 yyval.y_det->type = WAVELENGTH;
  1871.                 yyval.y_det->u.f = eval_fexpr(yypvt[-0].y_exp);
  1872.                 yyval.y_det->nxt = (details *)NULL;
  1873.       } break;
  1874. case 118:
  1875. # line 801 "gram.y"
  1876. {
  1877.                 yyval.y_det = (details *)smalloc(sizeof(details));
  1878.                 yyval.y_det->type = AMPLITUDE;
  1879.                 yyval.y_det->u.f = eval_fexpr(yypvt[-0].y_exp);
  1880.                 yyval.y_det->nxt = (details *)NULL;
  1881.       } break;
  1882. case 119:
  1883. # line 808 "gram.y"
  1884. {
  1885.                 yyval.y_det = (details *)smalloc(sizeof(details));
  1886.                 yyval.y_det->type = PHASE;
  1887.                 yyval.y_det->u.f = eval_fexpr(yypvt[-0].y_exp);
  1888.                 yyval.y_det->nxt = (details *)NULL;
  1889.       } break;
  1890. case 120:
  1891. # line 815 "gram.y"
  1892. {
  1893.                 yyval.y_det = (details *)smalloc(sizeof(details));
  1894.                 yyval.y_det->type = DAMPING;
  1895.                 yyval.y_det->u.f = eval_fexpr(yypvt[-0].y_exp);
  1896.                 yyval.y_det->nxt = (details *)NULL;
  1897.       } break;
  1898. case 121:
  1899. # line 825 "gram.y"
  1900. {
  1901.         yyval.y_det = (details *)NULL;
  1902.       } break;
  1903. case 122:
  1904. # line 829 "gram.y"
  1905. {
  1906.         yypvt[-0].y_det->nxt = yypvt[-1].y_det;
  1907.         yyval.y_det = yypvt[-0].y_det;
  1908.       } break;
  1909. case 123:
  1910. # line 834 "gram.y"
  1911. {
  1912.         yypvt[-0].y_det->nxt = yypvt[-1].y_det;
  1913.         yyval.y_det = yypvt[-0].y_det;
  1914.       } break;
  1915. case 124:
  1916. # line 839 "gram.y"
  1917. {
  1918.         yypvt[-0].y_det->nxt = yypvt[-1].y_det;
  1919.         yyval.y_det = yypvt[-0].y_det;
  1920.       } break;
  1921. case 125:
  1922. # line 846 "gram.y"
  1923. {
  1924.         defobj(yypvt[-3].y_str, yypvt[-4].y_sym->type, yypvt[-1].y_det);
  1925.  
  1926.         yyval.y_det = (details *)smalloc(sizeof(details));
  1927.  
  1928.         yyval.y_det->type = OBJECT;
  1929.         yyval.y_det->u.sym = lookup(yypvt[-3].y_str);
  1930.         yyval.y_det->nxt = (details *)NULL;
  1931.       } break;
  1932. case 126:
  1933. # line 856 "gram.y"
  1934. {
  1935.         ostackp++;
  1936.         *ostackp = (symbol *)NULL;
  1937.       } break;
  1938. case 127:
  1939. # line 861 "gram.y"
  1940. {
  1941.         details    *d;
  1942.  
  1943.         ostackp--;
  1944.  
  1945.         d = (details *)smalloc(sizeof(details));
  1946.  
  1947.         d->type = yypvt[-1].y_csg->type;
  1948.         d->u.csgobj.tree = yypvt[-1].y_csg;
  1949.         d->u.csgobj.det = yypvt[-2].y_det;
  1950.         d->nxt = (details *)NULL;
  1951.  
  1952.         defobj(yypvt[-5].y_str, CSG_OBJ, d);
  1953.  
  1954.         yyval.y_det = (details *)smalloc(sizeof(details));
  1955.  
  1956.         yyval.y_det->type = OBJECT;
  1957.         yyval.y_det->u.sym = lookup(yypvt[-5].y_str);
  1958.         yyval.y_det->nxt = (details *)NULL;
  1959.       } break;
  1960. case 128:
  1961. # line 882 "gram.y"
  1962. {
  1963.         defobj(yypvt[-3].y_str, COMP_OBJ, yypvt[-1].y_det);
  1964.  
  1965.         yyval.y_det = (details *)smalloc(sizeof(details));
  1966.  
  1967.         yyval.y_det->type = OBJECT;
  1968.         yyval.y_det->u.sym = lookup(yypvt[-3].y_str);
  1969.         yyval.y_det->nxt = (details *)NULL;
  1970.       } break;
  1971. case 129:
  1972. # line 895 "gram.y"
  1973. {
  1974.         yyval.y_csg = (csgnode *)smalloc(sizeof(csgnode));
  1975.         yyval.y_csg->type = OBJECT;
  1976.         yyval.y_csg->u.sym = yypvt[-0].y_sym;
  1977.       } break;
  1978. case 130:
  1979. # line 901 "gram.y"
  1980. {
  1981.         yyval.y_csg = (csgnode *)smalloc(sizeof(csgnode));
  1982.         yyval.y_csg->type = CSG_ADD;
  1983.         yyval.y_csg->u.branch.left = yypvt[-2].y_csg;
  1984.         yyval.y_csg->u.branch.right = yypvt[-0].y_csg;
  1985.       } break;
  1986. case 131:
  1987. # line 908 "gram.y"
  1988. {
  1989.         yyval.y_csg = (csgnode *)smalloc(sizeof(csgnode));
  1990.         yyval.y_csg->type = CSG_INT;
  1991.         yyval.y_csg->u.branch.left = yypvt[-2].y_csg;
  1992.         yyval.y_csg->u.branch.right = yypvt[-0].y_csg;
  1993.       } break;
  1994. case 132:
  1995. # line 915 "gram.y"
  1996. {
  1997.         yyval.y_csg = (csgnode *)smalloc(sizeof(csgnode));
  1998.         yyval.y_csg->type = CSG_SUB;
  1999.         yyval.y_csg->u.branch.left = yypvt[-2].y_csg;
  2000.         yyval.y_csg->u.branch.right = yypvt[-0].y_csg;
  2001.       } break;
  2002. case 133:
  2003. # line 922 "gram.y"
  2004. {
  2005.         yyval.y_csg = yypvt[-1].y_csg;
  2006.       } break;
  2007. case 134:
  2008. # line 926 "gram.y"
  2009. {
  2010.         char    buf[BUFSIZ];
  2011.  
  2012.         sprintf(buf, "art: object %s not defined.\n", yypvt[-0].y_str);
  2013.         fatal(buf);
  2014.       } break;
  2015. case 135:
  2016. # line 935 "gram.y"
  2017. {
  2018.         yyval.y_trm = yypvt[-0].y_trm;
  2019.       } break;
  2020. case 136:
  2021. # line 939 "gram.y"
  2022. {
  2023.         term    *t, *p, *np, *prod;
  2024.  
  2025.         prod = (term *)NULL;
  2026.         for (p = yypvt[-1].y_trm; p != (term *)NULL; p = p->nxt) {
  2027.             for (np = yypvt[-0].y_trm; np != (term *)NULL; np = np->nxt) {
  2028.                 t = (term *)smalloc(sizeof(term));
  2029.                 *t = *np;
  2030.                 t->coef *= p->coef;
  2031.                 t->xp += p->xp;
  2032.                 t->yp += p->yp;
  2033.                 t->zp += p->zp;
  2034.                 t->nxt = prod;
  2035.                 prod = t;
  2036.             }
  2037.         }
  2038.  
  2039.         for (t = yypvt[-1].y_trm; t != (term *)NULL; t = np) {
  2040.             np = t->nxt;
  2041.             free(t);
  2042.         }
  2043.  
  2044.         for (t = yypvt[-0].y_trm; t != (term *)NULL; t = np) {
  2045.             np = t->nxt;
  2046.             free(t);
  2047.         }
  2048.  
  2049.         yyval.y_trm = prod;
  2050.       } break;
  2051. case 137:
  2052. # line 969 "gram.y"
  2053. {
  2054.         yyval.y_trm = yypvt[-1].y_trm;
  2055.       } break;
  2056. case 138:
  2057. # line 973 "gram.y"
  2058. {
  2059.         term    *t, *p, *np, *prod, *nprod;
  2060.         int    i;
  2061.  
  2062.         prod = yypvt[-5].y_trm;
  2063.  
  2064.         for (i = 1; i != yypvt[-1].y_int; i++) {        
  2065.             nprod = (term *)NULL;
  2066.             for (p = yypvt[-5].y_trm; p != (term *)NULL; p = p->nxt) {
  2067.                 for (np = prod; np != (term *)NULL; np = np->nxt) {
  2068.                     t = (term *)smalloc(sizeof(term));
  2069.                     *t = *np;
  2070.                     t->coef *= p->coef;
  2071.                     t->xp += p->xp;
  2072.                     t->yp += p->yp;
  2073.                     t->zp += p->zp;
  2074.                     t->nxt = nprod;
  2075.                     nprod = t;
  2076.                 }
  2077.             }
  2078.             if (prod != yypvt[-5].y_trm)
  2079.                 for (t = prod; t != (term *)NULL; t = np) {
  2080.                     np = t->nxt;
  2081.                     free(t);
  2082.                 }
  2083.             prod = nprod;
  2084.         }
  2085.  
  2086.         for (t = yypvt[-5].y_trm; t != (term *)NULL; t = np) {
  2087.             np = t->nxt;
  2088.             free(t);
  2089.         }
  2090.  
  2091.         yyval.y_trm = prod;
  2092.       } break;
  2093. case 139:
  2094. # line 1009 "gram.y"
  2095. {
  2096.         term    *p;
  2097.  
  2098.         for (p = yypvt[-0].y_trm; p->nxt != (term *)NULL; p = p->nxt)
  2099.             ;
  2100.         yyval.y_trm = yypvt[-0].y_trm;
  2101.         p->nxt = yypvt[-2].y_trm;
  2102.       } break;
  2103. case 140:
  2104. # line 1018 "gram.y"
  2105. {
  2106.         term    *p, *lp;
  2107.  
  2108.         for (p = yypvt[-0].y_trm; p != (term *)NULL; p = p->nxt) {
  2109.             p->coef *= -1.0;
  2110.             lp = p;
  2111.         }
  2112.  
  2113.         yyval.y_trm = yypvt[-0].y_trm;
  2114.         lp->nxt = yypvt[-2].y_trm;
  2115.       } break;
  2116. case 141:
  2117. # line 1032 "gram.y"
  2118. {
  2119.         char    *p;
  2120.  
  2121.         yyval.y_trm = (term *)smalloc(sizeof(term));
  2122.         yyval.y_trm->coef = 1;
  2123.         yyval.y_trm->xp = 0;
  2124.         yyval.y_trm->yp = 0;
  2125.         yyval.y_trm->zp = 0;
  2126.         yyval.y_trm->nxt = (term *)NULL;
  2127.  
  2128.         for (p = yypvt[-0].y_str; *p != 0; p++)
  2129.             switch (*p) {
  2130.             case 'x':
  2131.                 yyval.y_trm->xp += 1;
  2132.                 break;
  2133.             case 'y':
  2134.                 yyval.y_trm->yp += 1;
  2135.                 break;
  2136.             case 'z':
  2137.                 yyval.y_trm->zp += 1;
  2138.                 break;
  2139.             default:
  2140.                 fatal("art: illegal name in equation.\n");
  2141.             }
  2142.       } break;
  2143. case 142:
  2144. # line 1058 "gram.y"
  2145. {
  2146.         yyval.y_trm = (term *)smalloc(sizeof(term));
  2147.         yyval.y_trm->coef = yypvt[-0].y_flt;
  2148.         yyval.y_trm->xp = 0;
  2149.         yyval.y_trm->yp = 0;
  2150.         yyval.y_trm->zp = 0;
  2151.         yyval.y_trm->nxt = (term *)NULL;
  2152.       } break;
  2153. case 143:
  2154. # line 1067 "gram.y"
  2155. {
  2156.         yyval.y_trm = (term *)smalloc(sizeof(term));
  2157.         yyval.y_trm->coef = yypvt[-0].y_int;
  2158.         yyval.y_trm->xp = 0;
  2159.         yyval.y_trm->yp = 0;
  2160.         yyval.y_trm->zp = 0;
  2161.         yyval.y_trm->nxt = (term *)NULL;
  2162.       } break;
  2163. case 144:
  2164. # line 1076 "gram.y"
  2165. {
  2166.         char    *p;
  2167.  
  2168.         yyval.y_trm = (term *)smalloc(sizeof(term));
  2169.         yyval.y_trm->coef = 1;
  2170.         yyval.y_trm->xp = 0;
  2171.         yyval.y_trm->yp = 0;
  2172.         yyval.y_trm->zp = 0;
  2173.         yyval.y_trm->nxt = (term *)NULL;
  2174.  
  2175.         for (p = yypvt[-4].y_str; *p != 0; p++)
  2176.             switch (*p) {
  2177.             case 'x':
  2178.                 yyval.y_trm->xp += 1;
  2179.                 break;
  2180.             case 'y':
  2181.                 yyval.y_trm->yp += 1;
  2182.                 break;
  2183.             case 'z':
  2184.                 yyval.y_trm->zp += 1;
  2185.                 break;
  2186.             default:
  2187.                 fatal("art: illegal name in equation.\n");
  2188.             }
  2189.  
  2190.         p--;
  2191.  
  2192.         switch (*p) {
  2193.         case 'x':
  2194.             yyval.y_trm->xp += yypvt[-1].y_int - 1;
  2195.             break;
  2196.         case 'y':
  2197.             yyval.y_trm->yp += yypvt[-1].y_int - 1;
  2198.             break;
  2199.         case 'z':
  2200.             yyval.y_trm->zp += yypvt[-1].y_int - 1;
  2201.             break;
  2202.         default:
  2203.             fatal("art: illegal name in equation.\n");
  2204.         }
  2205.       } break;
  2206. case 145:
  2207. # line 1120 "gram.y"
  2208. {
  2209.         yyval.y_exp = (expression *)smalloc(sizeof(expression));
  2210.         yyval.y_exp->type = EXP_FLOAT;
  2211.         yyval.y_exp->u.f = yypvt[-0].y_flt;
  2212.       } break;
  2213. case 146:
  2214. # line 1126 "gram.y"
  2215. {
  2216.         yyval.y_exp = (expression *)smalloc(sizeof(expression));
  2217.         yyval.y_exp->type = EXP_INT;
  2218.         yyval.y_exp->u.i = yypvt[-0].y_int;
  2219.       } break;
  2220. case 147:
  2221. # line 1132 "gram.y"
  2222. {
  2223.         yyval.y_exp = (expression *)smalloc(sizeof(expression));
  2224.         yyval.y_exp->type = EXP_INT;
  2225.         yyval.y_exp->u.i = *yypvt[-1].y_str;
  2226.         free(yypvt[-1].y_str);
  2227.       } break;
  2228. case 148:
  2229. # line 1139 "gram.y"
  2230. {
  2231.         yyval.y_exp = get_varexpr(yypvt[-0].y_str);
  2232.       } break;
  2233. case 149:
  2234. # line 1143 "gram.y"
  2235. {
  2236.         yyval.y_exp = get_expr(EXP_ADD, yypvt[-2].y_exp, yypvt[-0].y_exp);
  2237.       } break;
  2238. case 150:
  2239. # line 1147 "gram.y"
  2240. {
  2241.         yyval.y_exp = get_expr(EXP_SUB, yypvt[-2].y_exp, yypvt[-0].y_exp);
  2242.       } break;
  2243. case 151:
  2244. # line 1151 "gram.y"
  2245. {
  2246.         yyval.y_exp = get_expr(EXP_MUL, yypvt[-2].y_exp, yypvt[-0].y_exp);
  2247.       } break;
  2248. case 152:
  2249. # line 1155 "gram.y"
  2250. {
  2251.         yyval.y_exp = get_expr(EXP_DIV, yypvt[-2].y_exp, yypvt[-0].y_exp);
  2252.       } break;
  2253. case 153:
  2254. # line 1159 "gram.y"
  2255. {
  2256.         yyval.y_exp = get_expr(EXP_UMINUS, yypvt[-0].y_exp, (expression *)NULL);
  2257.       } break;
  2258.     }
  2259.     goto yystack;        /* reset registers in driver code */
  2260. }
  2261.